如何在 django 表单中包含 id 字段?
Posted
技术标签:
【中文标题】如何在 django 表单中包含 id 字段?【英文标题】:How do I include the id field in a django form? 【发布时间】:2017-10-13 01:48:57 【问题描述】:我正在尝试创建一个简单的表单,通过在表单中询问其 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 导入比尔
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
时,我什么也看不到。想法?
【问题讨论】:
【参考方案1】:在这种情况下,您不应该使用ModelForm
。 Fazil 对主键是什么以及为什么不应该尝试更新它给出了很好的答案。但这就是模型表单的意义所在。
另一方面,在某些情况下,客户被要求提供“参考号”,这样的参考号通常恰好是主键。所以在这种情况下,解决方案是使用简单的表单而不是模型表单。
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()
【讨论】:
谢谢,这就是我要找的!提醒一下,我认为该类应该继承自forms.Form
,因为ModelForm
给出了ValueError
,因为我们没有指定模型。
对不起,错字。感谢您指出。祝您的项目一切顺利
谢谢e4c5! :)
这让我很生气,由于某种原因,我使用的是 'id' 而不是 'pk'。谢谢!【参考方案2】:
ID 是 django 中模型自动添加的主键字段,仅当模型中未设置主键时。不能为现有对象修改该字段,甚至不能为新对象创建该字段。 即使我们尝试修改它,也会在旧对象旁边创建一个新对象。它更适合用作特定对象的引用而不是字段参数。
来自文档:
主键
如果为 True,则此字段是模型的主键。
如果您没有为模型中的任何字段指定 primary_key=True,Django 将自动添加一个 IntegerField 来保存主键,因此您无需在任何字段上设置 primary_key=True 除非您愿意覆盖默认的主键行为。有关详细信息,请参阅自动主键字段。
主键字段是只读的。如果您更改现有对象的主键值并保存它,则会在旧对象旁边创建一个新对象。
您可以像这样在模板中使用 ID 字段。 object.auto_id
为什么要在表单中使用 ID 字段??
【讨论】:
感谢您的回复!我要做的基本上是让用户输入账单记录的 id 来定位它,而不是使用其他属性——它基本上是一个只使用 id 值进行搜索的搜索框。 这就是我的想法,当我在看到此评论之前输入答案时:) @zaidfazil 只是在这里学习 Django(所以请原谅任何无意的愚蠢),但假设您想显示一条记录,以便用户可以在屏幕上编辑它(当然,除了 id 之外的所有字段)。您是否不需要将 id 存储在表单中的某个位置然后将其显示在屏幕上,即使您将其隐藏以使用户看不到它?如果没有,您如何获取 id 以知道要编辑数据库中的哪条记录?如果人们没有将记录 ID 存储在 HTML 表单中的某个位置,他们如何做到这一点?我显然在这里遗漏了一些东西,所以任何帮助将不胜感激。谢谢! 如果您使用的是ModelForm
,那么您尝试编辑的对象可以传递到表单中,其余部分由它处理。如果没有,那么为了显示现有数据,您确实拥有id
,这是primary_key,可用于在所需编辑后执行PUT/PATCH请求。在 django 模板中,你不必显式存储 id,上下文字典肯定包含对象的 id。以上是关于如何在 django 表单中包含 id 字段?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Javascript 生成的 HTML 表单中包含 Django 1.2 的 CSRF 令牌?
Django:如何在 list_display 中包含内联模型字段?
如何使用 AFHTTPRequestOperation 在表单字段中包含 JSON
Django Rest 框架,如何在 ModelSerializer 中包含“__all__”字段和相关字段?