【问题标题】:Django set Boolean to False when clicking a button单击按钮时,Django 将布尔值设置为 False
【发布时间】:2022-01-25 22:05:32
【问题描述】:

以下代码(仅用于学习 Django)允许使用 HTML 按钮将用户的工单标记为“已解决”。单击按钮时,ticked_solved 设置为 True,ticket_waiting 设置为 False。

这在我测试过的模板中也可以识别。但随后在仪表板中,对象也必须更改为 False/True,正如您在屏幕截图中看到的那样,情况并非如此。

我用一个表格来做这一切,这可能也不是最聪明的选择。

\\models.py

class Ticket(models.Model):
    user = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        default=None,
        null=True,
        on_delete=models.CASCADE,
    )
    title = models.CharField(max_length=200)
    description = models.TextField()
    ticket_waiting = models.BooleanField(default=True)
    ticket_solved = models.BooleanField(default=False)

    def __str__(self):
        return str(self.title)

\\forms.py

class TicketSolved(forms.Form):
    delete = forms.CharField(
        label='', max_length=0).widget = forms.HiddenInput()

\\views.py

def ticket_system_view(request, id):
    obj = Ticket.objects.get(id=id)

    form2 = TicketSolved(request.POST)

    if request.method == 'POST':

        if form2.is_valid():
            obj.ticket_waiting = False
            obj.ticket_solved = True

    return render(request, 'ticket-system.html', {'obj': obj, 'form2': form2})

\\.html


{% if obj.user != request.user %}
<p>Page Not Found</p>

{% else %}
<p>Ticket ID {{obj.id}}</p>

{{ obj.title }} {{ obj.description }} {% endif %}
<br></br>

<form method="POST">
  {% csrf_token %} {{ form2 }}
  <button type="submit">Status to Solved</button>
</form>

----Just to test if it works:

 {% if obj.ticket_waiting == True %}
  <p>Waiting for Reply.</p>
  {% else %}
  <p>Ticket solved.</p>
  {% endif %}

\\urls.py 如果需要

    path('dashboard/user/ticket/<int:id>/',
         ticket_system_view, name="view_ticket"),

以及点击按钮后的屏幕截图 screenshot

您知道为什么管理仪表板中的复选框没有调整吗?

【问题讨论】:

    标签: python django


    【解决方案1】:

    更新后忘记保存对象:

    from django.shortcuts import get_object_or_404
    
    def ticket_system_view(request, id):
        obj = get_object_or_404(Ticket, id=id)
        if request.method == 'POST':
            obj.ticket_waiting = False
            obj.ticket_solved = True
            obj.save()  # ? save the update in the database
            return redirect('view_ticket', id=id)
    
        return render(request, 'ticket-system.html', {'obj': obj})

    这里不需要任何表单:这是一个简单的按钮,您可以只用一个看起来像这样的按钮来呈现表单:

    <form method="POST">
      {% csrf_token %}
      <button type="submit">Status to Solved</button>
    </form>

    注意:通常最好使用get_object_or_404(…) [Django-doc], 然后直接使用.get(…) [Django-doc]。如果对象不存在, 例如,由于用户自己更改了 URL,get_object_or_404(…) 将导致返回 HTTP 404 Not Found 响应,而使用 .get(…) 将导致 HTTP 500 服务器错误


    注意:如果 POST 请求成功,您应该发送redirect [Django-doc] 实施Post/Redirect/Get pattern [wiki]。 这样可以避免在用户刷新时发出相同的 POST 请求 浏览器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-24
      • 1970-01-01
      • 2012-07-14
      • 2023-03-25
      • 1970-01-01
      • 2020-06-23
      • 2014-07-03
      相关资源
      最近更新 更多