如何在 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__”字段和相关字段?

在 Django 表单中包含 Dropzone 表单时无法进行完整的 POST

django如何在 search_fields和list_filter 中包含外键字段