尽管添加了错误标签,但表单未提交,并且在Temp中未打印错误

2024-10-03 02:39:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在将表单保存到数据库之前预览用户提交的所有数据。我写了下面的代码,但它没有提交,也没有显示错误。即使我在代码中插入print以打印输入的数据,它也不会打印任何数据

因此,逻辑是这样的,当用户添加数据并单击“确认订单”时,他/她将被带到“preview.html”,其中将显示提交的数据。当用户满意时,他/她将单击保存按钮。preview.html中的表单操作是/add_buy_order/”

观点

@login_required
def add_buy_order(request):
    newbc = None
    template_name = 'ctrade/buycurrency.html'
    if request.method=="POST":
        form=BuyCurForm(request.POST)
        if form.is_valid():
            data=form.cleaned_data
            requested_amount_needed = request.POST.get('amount_needed')
            deck_am_needed = Decimal(requested_amount_needed) 
            fixed_amount = Decimal('999.0')
            requested_amount_to_pay = request.POST.get('amount_to_pay')
            requested_disc_code = request.POST.get('discount_code')
            requested_disc_value = request.POST.get('discount_value')
            requested_cur_one = request.POST.get('cur_address')
            requested_cur_two = request.POST.get('cur_address_two')
            requested_bank = request.POST.get('deaccount')
            tapde = DEAccount.objects.get(bank_name= requested_bank)


            if not str(requested_cur_one) == str(requested_cur_two):
                messages.info(request, 'Address to fund mismatch. Cross-check again')
                return redirect('add_buy_order')

            if '_preview' in request.POST:
                newbc=BuyCur(
                    buyer=request.user,
                    cur_type = data['cur_type'],
                    amount_needed = data['amount_needed'],
                    deaccount = tapde, 
                    amount_to_pay = data['amount_to_pay'],
                    cur_address = data['cur_address'],
                    cur_address_two = data['cur_address_two'],
                    rate_bought = data['rate_bought'],
                    cur_note = data['cur_note'],
                    pub_date=datetime.datetime.now(),
                    modified_date = datetime.datetime.now(),
                    discount_code = data['discount_code']
                )
                print newbc.buyer, newbc.cur_type, newbc.amount_needed, newbc.deaccount, newbc.amount_to_pay, newbc.cur_address,
                newbc.cur_address_two, newbc.rate_bought, newbc.cur_note, newbc.pub_date, newbc.modified_date, newbc.discount_code

                return render(request, 'ctrade/preview.html',{'newbc':newbc})

            elif '_save' in request.POST:
                newbc=BuyCur(
                    buyer=request.user,
                    cur_type = data['cur_type'],
                    amount_needed = data['amount_needed'],
                    deaccount = tapde, 
                    amount_to_pay = data['amount_to_pay'],
                    cur_address = data['cur_address'],
                    cur_address_two = requested_cur_two,
                    rate_bought = data['rate_bought'],
                    cur_note = data['cur_note'],
                    pub_date=datetime.datetime.now(),
                    modified_date = datetime.datetime.now(),
                    discount_code = data['discount_code'])
                newbc.save()
                return render(request, 'ctrade/afterbuy.html', {'newbc':newbc})
    else:
        form=BuyCurForm()
    return render(request, template_name,{'form':form,'newbc':newbc})

形式

class BuyCurForm(forms.ModelForm):
    cur_type = forms.ModelChoiceField(queryset = CurrencyTrade.objects.all(), to_field_name = "we_sell")
    deaccount = forms.ModelChoiceField(queryset = DEAccount.objects.all(), to_field_name = "bank_name")
    amount_needed = forms.DecimalField(widget= forms.TextInput, max_digits=10,  decimal_places=1, initial=0.0 ,required = True)
    amount_to_pay = forms.DecimalField(widget= forms.TextInput, max_digits=10,  decimal_places=2, initial=0.00 ,required = True)
    rate_bought = forms.IntegerField()

    def __init__(self, *args, **kwargs):
        super(BuyCurForm, self).__init__(*args, **kwargs)
        self.fields['amount_to_pay'].widget.attrs['readonly'] = True
        self.fields['rate_bought'].widget.attrs['readonly'] = True

    class Meta:
        model = BuyCur
        fields = ['cur_type','amount_needed','amount_to_pay','rate_bought','deaccount','cur_address','cur_address_two','cur_note','discount_code']

模板

    <form method="POST" action="">
     {% csrf_token %} 
      {% for field in form %}
    <div class="fieldWrapper">
        {{ field.errors }}
        {{ field.label_tag }} {{ field }}
        {% if field.help_text %}
        <p class="help">{{ field.help_text|safe }}</p>
        {% endif %}
    </div>
{% endfor %}
<input type="submit"   name="_preview"  value="Confirm Order">
<input type="hidden"  name="next" value="{{ next }}">
</form>

我错过了什么?还是有更好的办法


Tags: tonameformdataaddressrequesttypepost
1条回答
网友
1楼 · 发布于 2024-10-03 02:39:35

有两种方法可以做到这一点

1)如果您想要django消息,那么您的模板应该包含以下代码

template.html

   {% if messages %}
        {% for message in messages %}
        <div class="alert alert-success" role="alert">
         <strong>{{ message }}</strong>
       </div>
        {% endfor %}
    {% endif %}

2)如果要使用form.errors,则不应像当前那样发送表单的新实例。您应该发送无效的表单实例

views.py

#######
else:
        form=BuyCurForm()
    return render(request, template_name,{'form':form,'newbc':newbc, })

正确的视图.py

####
else:
    return render(request, template_name,{'form':form,'newbc':newbc})

相关问题 更多 >