无法在Django中更新商品 [英] Not able to update an item in Django

查看:30
本文介绍了无法在Django中更新商品的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试通过获取用户的详细信息并设置Bar实例来更新用户的Bar Information.但是,每当我单击仪表板上的链接时,它就会将我重定向到仪表板,如果不是post方法,则将其用于else语句.

I am trying to update the Bar Information for users by getting their details and setting the Bar instance. But every time I click on the link on my dashboard it redirects me to the dashboard which is what I used for the else statement if it is not a post method.

view.py

def UpdateUserBar(request):
    user = request.user.id
    bar = Bar.objects.get(user_id=user)
    form = UpdateBar(instance=bar)
    if request.method == 'POST':
        form = UpdateBar(request.POST,request.FILES, instance=bar)
        if form.is_valid():
            form.save()
            return redirect('/updatebar')
            messages.success(request, 'Bar Information Updated successfully')
        else:
            return redirect('/dashboard')
            messages.error(request, 'Only Post method is accepted')
    else:
        form = UpdateBar(instance=bar)
    context = {"form":form, "bar":bar}
    return render(request, "dashboard/super/landlord/update_bar.html", context)

forms.py

class UpdateBar(ModelForm):
    class Meta:
        model = Bar
        fields = '__all__'

models.py

models.py

class Bar(models.Model):

    status = (
            ("open", "open"),
            ("closed", "closed"),
            ("pending", "pending"),
        )

    user_id = models.OneToOneField(User, on_delete=models.CASCADE)
    name = models.CharField(max_length=50)
    address = models.CharField(max_length=100)
    opening_time = models.TimeField()
    closing_time = models.TimeField()
    status = models.CharField(choices=status, default="pending", max_length=14)
    image = models.ImageField(upload_to='images/bars', default='images/bars/default.jpg')

    def __str__(self):
        return self.name

updatebar.html

updatebar.html

{% load i18n widget_tweaks %}
<form class="form-horizontal" role="form" method="post" enctype="multipart/form-data">
    {% csrf_token %}
    <div class="form-group">
        <label class="col-md-2 control-label">{{ form.name.label }}:</label>
        <div class="col-md-10">
            <input type="text" id="id_name" name="name" class="form-control" value="{{user.name}}" disabled>
        </div>
    </div>

    <div class="form-group">
        <label class="col-md-2 control-label">{{ form.user_id.label }}:</label>
        <div class="col-md-10">
            <input id="id_user_id" name="user_id" type="text" class="form-control" value="{{user_email}}" disabled>
        </div>
    </div>

    <div class="form-group">
        <label class="col-md-2 control-label">{{ form.address.label }}:</label>
        <div class="col-md-10">
            {{ form.address|attr:"class:form-control" }}
        </div>
    </div>

    <div class="form-group">
        <label class="col-md-2 control-label">{{ form.opening_time.label }}</label>
        <div class="col-md-10">
            {{ form.opening_time | attr:"class:form-control"  }}
        </div>
    </div>
    <div class="form-group">
        <label class="col-md-2 control-label">{{ form.closing_time.label }}</label>
        <div class="col-md-10">
            {{ form.closing_time | attr:"class:form-control"   }}
        </div>
    </div>
    <div class="form-group">
        <label class="col-md-2 control-label">{{ form.status.label }}</label>
        <div class="col-md-10">
            {{ form.status| attr:"class:form-control" }}
        </div>
    </div>
    <div class=" form-group ">
        <div class="input-group col-lg-12 ">
            <label class="col-md-2 control-label">{{ form.image.label}}</label>

            <div class="col-md-10">
                <div class="bootstrap-timepicker">
                {{ form.image| attr:"class:form-control" }}                                    </div>
                
            </div><!-- input-group -->                                        </div>
        </div>
            <div class="form-group">
                <div class="col-md-10">
                    <center><button class="btn btn-primary" type="submit">Update Bar Info</button></center>
                </div>
            </div>
        </form>

每次我尝试访问访问URL时,它都会将我重定向到仪表板.

Every time I try to access the visit the URL, it redirects me to the dashboard.

推荐答案

好的,这里有两个小问题,首先,如果您只想返回一个对象,请使用 get 而不是 filter ,因为如果没有找到对象,它会给您一个 DoesNotExist 错误,使用 filter 时将返回一个空的查询集,这将使错误更难解决跟踪.

Alright so there's a couple of small problems here, first of all if you want to retreive only one object use get instead of filter because it will give you a DoesNotExist error if no object is found, when using filter will return an empty queryset which will make an error harder to trace.

也在您的 Bar 模型中,我看到 user_id 字段,我假设它是 Bar 的所有者,您应该将其命名为<代码>所有者或<代码>用户以提高可读性.

Also in your Bar model I see user_id field which I presume is the owner of the Bar, you should name it something like owner or user for better readability.

这是我写这个视图的方式:

Here is how I would write this view:

def update_user_bar(request): # use uppercase view names for class-based-views, if its a custom view, use regular variable names
    user = request.user # <------- change this 
    user_email = request.user.email
    bar = Bar.objects.get(user_id=user)
    if request.method == 'POST':
        form = UpdateBar(request.POST, request.FILES, instance=bar)
        if form.is_valid():
            form.save()
            return redirect('/updatebar')
            messages.success(request, 'Bar Information Updated successfully')
        else: # here is where your problem is, you need to fix your code indentation
            return redirect('/dashboard')
            messages.error(request, 'Only Post method is accepted')
    else: 
        form = UpdateBar(instance=bar) # assign your form here for better radability
    context = {"form":form, "user_email":user_email, "bar":bar}
    return render(request, "dashboard/super/landlord/update_bar.html", context)

更新

仅接受Post方法消息没有任何意义,因为要访问您网站中的任何视图,您首先要使用Http GET 方法:)

Also Only Post method is accepted message makes no sense because to access any view in your website you are using Http GET method before anything else :)

这篇关于无法在Django中更新商品的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆