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

时间:2017-05-14 02:20:39

标签: python django forms 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)

forms.py

来自django导入表单     来自django.forms导入ModelForm     来自transactions.models导入Bill

class BillSelectForm(ModelForm):
    class Meta:
        model = Bill
        fields = ('id',)

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})

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

2 个答案:

答案 0 :(得分:4)

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

另一方面,在某些情况下,客户被要求提供一个参考号码'这样的参考号通常恰好是主键。所以在这种情况下,解决方案是使用一个简单的Form而不是ModelForm。

class BillSelectForm(forms.Form):
    pk = forms.IntegerField()

然后

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

else:
    form = BillSelectForm()

答案 1 :(得分:1)

ID是django中模型的自动添加的主键字段,仅当未在模型中设置主键时。无法为现有对象修改该字段,也无法为新对象创建该字段。 即使我们尝试修改它,也会在旧对象旁边创建一个新对象。它更适合用作特定对象的参考,而不是用作字段参数。

来自文档:

  

primary_key

     

如果为True,则此字段是模型的主键。

     

如果你没有为模型中的任何字段指定primary_key = True,Django会自动添加一个IntegerField来保存主键,因此你不需要在任何字段上设置primary_key = True,除非你想要覆盖默认的主键行为。有关更多信息,请参阅自动主键字段。

     

主键字段为只读。如果更改现有对象上主键的值然后保存它,则将创建一个与旧对象并列的新对象。

您可以像这样在模板中使用ID字段。 {{object.auto_id}}

为什么要在表单中使用ID字段?