[英]Django how to solve saving empty form problem?
我正在嘗試在我的 Django 項目的一頁中使用 2 個不同的 forms。
它們有不同的表單模型,但它們在同一頁面中並使用相同的視圖 function。
當我嘗試它們時,它們都可以工作,但是當我發布其中一個時,另一個也保存為空表單。 但我不想要這個。
為什么會這樣?
視圖.py
def ocr(request, id):
...
pdf = get_object_or_404(Pdf, id=id)
approval = ApprovalProcess(user_id=request.user, highest_rank=1)
#FORM 1
if request.method == 'POST':
form = PdfRiskForm(request.POST, request.FILES, instance=pdf)
if form.is_valid():
form.save()
if pdf.risk_rating == "Low Risk":
n = len([x for x in doa_low_list if x < pdf.credit_limit])
approval.highest_rank = n
elif pdf.risk_rating == "Medium Risk":
n = len([x for x in doa_medium_list if x < pdf.credit_limit])
....
approval.save()
else:
form = PdfRiskForm()
#FORM 2
if request.method == 'POST':
form_2 = CommentForm(request.POST or None)
if form_2.is_valid():
form_2.instance.comment_other = form.cleaned_data.get("comment_other")
form_2.instance.username = request.user
form_2.instance.comp_name = userP[0].company
form_2.instance.doc_id = pdf
if form_2.comment_others is not None:
form_2.save()
else:
form_2 = CommentForm()
模型.py
class PdfRiskForm(forms.ModelForm):
risk_rating = forms.ChoiceField(label='Risk Rating', choices=Pdf.RISK_RATING)
credit_limit = forms.IntegerField()
comments = RichTextField
letter_portion = forms.IntegerField(min_value=0, max_value=100, required=False, label="Guarantee Portion (%)")
class Meta:
model = Pdf
fields = ['risk_rating', 'credit_limit', 'letter_portion', 'comments']
class CommentFromOthers(models.Model):
comp_name = models.ForeignKey(CompanyProfile, on_delete=models.CASCADE, null=True)
doc_id = models.ForeignKey(Pdf, on_delete=models.DO_NOTHING, null=True)
comment_others = RichTextField(blank=True)
created_date = models.DateTimeField(default=datetime.now())
username = models.ForeignKey(UserProfile, on_delete=models.CASCADE)
模板.html
<div class="card-body">
<form method="POST" enctype="multipart/form-data">
<!-- Very Important csrf Token -->
{% csrf_token %}
{{ form.media }}
{{ form|crispy }}
<input type="submit" class="btn btn-primary btn-lg" value="Approve">
</form>
</div>
...
<div id="demo" class="collapse">
<form method="POST" enctype="multipart/form-data">
<!-- Very Important csrf Token -->
{% csrf_token %}
{{ form_2.media }}
{{ form_2|crispy }}
<input type="submit" class="btn btn-primary btn-lg" value="Send">
</form>
</div>
最好在不同的視圖函數中處理 forms。
如果您一心想在同一個 function 中同時處理 forms,則需要添加一個“標記”字段,然后再嘗試驗證表單。
if request.method == 'POST' and request.POST.get('form') == 'risk':
form = PdfRiskForm(...)
elif request.method == 'POST' and request.POST.get('form') == 'comment':
form = ...
然后將form
字段與您提交的表單一起提交:
<form method="POST" enctype="multipart/form-data">
{% csrf_token %}
<input type="hidden" name="form" value="risk" /> <!-- or comment -->
另一種方法可能是將每個表單發送到不同的 URL(每個都有自己的視圖)。
2 forms 仍然可以在同一個 HTML 頁面中(相同的模板),但您為每個頁面指定不同的action
屬性。
<form method="POST" enctype="multipart/form-data"
action="/my-url-1/">
...
</form>
...
<form method="POST" enctype="multipart/form-data"
action="/my-url-2/">
...
</form>
這樣,您可以簡化每個視圖,並且不會將不必要的數據(意思是:其他 forms 數據)發布到視圖。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.