我正在尝试创建一个简单的表单,通过在表单中询问其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 }}
时,我什么都没看到。想法?
答案 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字段?