[英]Django how to handle 2 Post Requests
我有一個微票系統。 用戶有關於工單的信息,一個標記為已解決/標記為等待的按鈕,以及一個為管理員添加新消息到工單的消息框。
您可以忽略 forms 中的大部分內容,重要的是 forms 的 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 時,工單會自動標記為已解決,以避免垃圾郵件。
問題:我在視圖中有兩個 forms -user_form 用於用戶的消息 -button_form 用於僅包含計數器按鈕的表單
實際上我不需要 button_form 的表單,但現在這無關緊要。
如果我現在發送 user_form,button_form 也會被發送,所以計數器會增加。 如何更改我的代碼,以便在發送 user_form 時只發送 user_form 而不發送 button_form? 反之亦然。 還有更多問題,例如不工作的 user_form 但首先要做的事情。
非常感謝::^)
編輯:這是 HTML 文件,其中顯示 forms
{% 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>
您可以使用單獨的路線為第二個表單創建單獨的模板,並使用包含模板標簽將該模板包含在您的主模板中,如下所示:
second_template.html:
<form method="POST" action='second_view/'>
{% csrf_token %}
{{ user_form }}
<button type="submit">New Message</button>
</form>
網址.py:
path('second_view', views.second_view, name='second_view')
視圖.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 傳遞給表單,就像在原始模板中傳遞它一樣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.