如何在django表单中包含id字段?

hal*_*nes 2 python forms django django-forms

我正在尝试创建一个简单的表单,通过询问表单中的ID来提取记录。

views.py

class Bill(models.Model):
    """
    Represents a single purchase made by a customer at a business.
    """
    business = models.ForeignKey(Businesses)
    customer = models.ForeignKey(User, blank=True, null=True)
    charge = models.ForeignKey(Charge, blank=True, null=True)
    amount = models.IntegerField(verbose_name='Purchase amount (in cents)',
                                 validators=[MinValueValidator(0)])
    tip = models.IntegerField(verbose_name='Tip amount (in cents)',
                                 validators=[MinValueValidator(0)])
    comments = models.CharField(max_length=255, blank=True, null=True)
    timestamp = models.DateTimeField(auto_now_add=True)
Run Code Online (Sandbox Code Playgroud)

表格

从Django导入表单从django.forms导入ModelForm从transaction.models导入Bill

class BillSelectForm(ModelForm):
    class Meta:
        model = Bill
        fields = ('id',)
Run Code Online (Sandbox Code Playgroud)

views.py

@login_required(login_url='/sign-in/')
def select_bill(request):
    """
    Finds a bill based on its ID number.
    """
    if request.method == 'POST':
        form = BillSelectForm(request.POST)
        if form.is_valid():
            pass
            # look up db for id number
            # go to bill view page if id found AND bill not paid
            # go back to same page and create message saying wrong bill

    else:
        form = BillSelectForm()

    return render(request, 'bill_select.html', {'form': form})
Run Code Online (Sandbox Code Playgroud)

但是,在模板上,当我使用时{{ form.as_p }},我什么都看不到。有什么想法吗?

e4c*_*4c5 5

在这种情况下,您不应该使用ModelForm。Fazil对于主键是什么以及为什么不应该尝试更新它给出了很好的答案。但这就是模型形式的目的。

另一方面,在某些情况下,要求客户提供“参考号”,因此参考号通常恰好是主键。因此,在这种情况下,解决方案将是使用简单的Form而不是ModelForm。

class BillSelectForm(forms.Form):
    pk = forms.IntegerField()
Run Code Online (Sandbox Code Playgroud)

然后

if request.method == 'POST':
    form = BillSelectForm(request.POST)
    if form.is_valid():
        bill = Bill.objects.get(form.cleaned_data['pk'])

else:
    form = BillSelectForm()
Run Code Online (Sandbox Code Playgroud)