簡體   English   中英

Django 如何解決保存空表單問題?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM