【问题标题】:Not able to update an item in Django无法更新 Django 中的项目
【发布时间】:2023-03-08 21:38:01
【问题描述】:

我正在尝试通过获取用户的详细信息并设置 Bar 实例来更新用户的 Bar 信息。但是每次我点击仪表板上的链接时,它都会将我重定向到仪表板,如果它不是 post 方法,我会在 else 语句中使用它。

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

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

{% 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 时,它都会将我重定向到仪表板。

【问题讨论】:

  • 向我们展示您的 html 表单
  • 已更新,再次检查问题
  • 表单先用GET请求渲染,你不允许它渲染
  • 我不是很了解,因为我是初学者。

标签: django django-models django-views django-forms django-templates


【解决方案1】:

好吧,这里有几个小问题,首先,如果你想只检索一个对象,请使用get 而不是filter,因为如果没有找到对象,它会给你一个DoesNotExist 错误,当使用filter 将返回一个空查询集,这将使错误更难追踪。

在您的 Bar 模型中,我看到 user_id 字段,我认为它是 Bar 的所有者,您应该将其命名为 owneruser 以提高可读性。

我会这样写这个视图:

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 方法:)

【讨论】:

  • 它接缝你错误地缩进上下文并在最后一个 else 语句下返回渲染。我不确定这是否正确。
  • 我已将 views.py 更改为您的方法,现在它会呈现预先填充信息的页面,但在更新字段并单击更新按钮后,它会将我发送到仪表板页面,而没有采取任何保存操作。
  • 那意味着你的表单验证失败,尝试调试一下就回来了
  • 同时检查你的表单 html 看起来你有很多未关闭的 div,表单结束标签离它的开启者位置很远
  • 所有 div 都已关闭,先生。我又检查了一遍
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 2019-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多