【问题标题】:Django how to handle 2 Post RequestsDjango 如何处理 2 个 Post 请求
【发布时间】:2022-01-26 17:29:05
【问题描述】:

我有一个微票系统。用户拥有有关工单的信息、一个标记为已解决/标记为等待的按钮以及一个用于向管理员添加新消息到工单的消息框。

您可以忽略表单中的大部分内容,重要的是表单的 GET/POST 请求。

\\views.py

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

    waiting_message = "Mark as 'Waiting'"
    solved_message = "Mark as 'Solved'"

    if obj.reopened_counter > 5:
        solved_message = 'Ticked solved forever'
        waiting_message = 'Ticked solved forever'

    button_form = TicketSolved(request.POST)
    time.sleep(2)

    if button_form.is_valid:
        obj.reopened_counter += 1
        if obj.reopened_counter > 5:
            obj.ticket_waiting = True
            obj.ticket_solved = False

        if obj.ticket_waiting == False and obj.ticket_solved == True:
            obj.ticket_waiting = True
            obj.ticket_solved = False
        else:
            obj.ticket_waiting = False
            obj.ticket_solved = True
        obj.save()


    user_form = TicketMessagesForm(
        request.POST, instance=TicketMessages(id=id))
    if user_form.is_valid():
        instance = user_form.save(commit=False)
        #this form doesnt work yes
        instance.save()

    return render(request, 'ticket-system.html', {'obj': obj, 'waiting_message': waiting_message, 'solved_message': solved_message, 'button_form': button_form, 'user_form': user_form})

\\forms.py

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


class TicketMessagesForm(forms.ModelForm):
    class Meta:
        model = TicketMessages

        fields = (
            'user_message',
        )

\\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()
    creator_adress = models.GenericIPAddressField(null=True)
    start_date = models.DateTimeField(default=timezone.now)
    ticket_waiting = models.BooleanField(default=True)
    ticket_solved = models.BooleanField(default=False)
    reopened_counter = models.IntegerField(default=0)


class TicketMessages(models.Model):
    ticket = models.ForeignKey(Ticket, on_delete=models.CASCADE, default=None)
    admin_message = models.TextField(null=True, default=None)
    user_message = models.TextField(null=True, default=None)

每次用户将工单设置为已解决/等待时,都会有一个计数器计数。当计数器达到 5 时,工单会自动标记为已解决,以避免垃圾邮件。

问题: 我在视图中有两个表格 -user_form 用于用户的消息 -button_form 用于仅包含计数器按钮的表单

其实我并不需要 button_form 的表单,不过暂时无所谓。

如果我现在发送 user_form,button_form 也会发送,因此计数器会增加。如何更改我的代码,以便在发送 user_form 时只发送 user_form 而不发送 button_form?反之亦然。还有更多问题,例如不工作的 user_form,但首先要解决的问题。

非常感谢! :^)

编辑: 这是显示表单的 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 %}
  {{ button_form }}
  <button {% if obj.reopened_counter > 5 %} disabled="" {% endif %} type="submit">
  {% if obj.ticket_waiting == True %}
   {{ solved_message }}
  {% else %}
  {{ waiting_message }}
  {% endif %}
</button>
</form>

<p> Changes: {{ obj.reopened_counter }} </p>

<br>
<h2>New Message</h2>
<form method="POST">
  {% csrf_token %}
  {{ user_form }}
  <button type="submit">New Message</button>
</form>

【问题讨论】:

  • 您是说在视图ticket_system_view 中您应该有办法执行TicketSolved 或TicketMessagesForm 两种形式之一
  • 我的意思是如果我执行一个,两个都会被执行这是错误的
  • 为user_form创建一个单独的视图,并在form的action属性中指定url。
  • 我应该如何在一个 HTML 模板中呈现 2 个不同的视图

标签: python django frameworks


【解决方案1】:

您可以使用单独的路由为第二个表单创建单独的模板,并使用包含模板标签将该模板包含在您的主模板中,如下所示:

second_template.html:

 <form method="POST" action='second_view/'>
   {% csrf_token %}
   {{ user_form }}
   <button type="submit">New Message</button>
 </form>

urls.py:

 path('second_view', views.second_view, name='second_view')

views.py:

def second_view(request, id):
    user_form = TicketMessagesForm(
        request.POST, instance=TicketMessages(id=id))
    if user_form.is_valid():
        instance = user_form.save(commit=False)
        #this form doesnt work yes
       instance.save()

     return render(request, 'second_template.html', {'user_form': user_form})

最后一个难题是将您的 second_template 包含在您的 ticket_system 中,因此将第二个表单替换为 {% include second_template.html %}。您可以将 id 传递给表单,就像在原始模板中传递它一样。

【讨论】:

  • @vize 为什么未将其标记为已接受?
猜你喜欢
  • 1970-01-01
  • 2018-08-19
  • 2021-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多