【问题标题】:Django hide date field from formDjango从表单中隐藏日期字段
【发布时间】:2015-04-16 16:33:47
【问题描述】:

我希望对用户隐藏一个日期字段,但将其作为表单的一部分进行处理,以便我知道表单的发送日期。我也希望在 Django admin 下显示这个日期。

models.py

class Purchase(models.Model):
   payment_type = models.ForeignKey('CardChoices', related_name='Payment Types')
   card_name = models.CharField(max_length=26, default=None, validators=[alphanumeric_RE]) 
   card_number = models.CharField(max_length=19, default=None)
   security_code = models.IntegerField(max_length=3, default=None) 
   expiry_date = models.DateField(default=datetime.now)
   date = models.DateField(auto_now=True, default=datetime.now)

    def __str__(self):
        return self.card_name

    class Meta:
        ordering = [ "date" ]

forms.py

class PurchaseForm(forms.ModelForm):
    date = forms.DateField(widget=extras.SelectDateWidget, initial=date.today)

    class Meta:
        model = Purchase
        fields = "__all__"

我尝试使用排除标记隐藏 Meta 下的字段,并且只在字段下添加我需要的字段,但它仍然显示所有字段。我试过使用forms.HiddenInput(),它确实隐藏了输入,但它也隐藏了管理员的值。虽然我发现这个显示日期,但似乎重复了两次:

    def get_readonly_fields(self, request, obj=None): #duplicating entries
        if obj:
             return ["date"]
        return self.readonly_fields

如果设置了HiddenInput,表单会隐藏该字段,但仍会要求输入有效日期。

如果我的理解是正确的,我也不能在表单上使用auto_now_add。有什么建议吗?

【问题讨论】:

  • 从 PurchaseFrom 中删除日期。与其fields = ('__ all__'),不如将所有字段一个一个写出来。稍后,如果您的模型发生更改,您可能想要控制表单显示的内容。无论如何,如果它不在 Meta 中的“字段”列表中,则它不应该出现。您可以在模型中添加 auto_now。
  • 太好了,谢谢。我会注意到这一点。相当避免明显的那里......
  • 您不需要default=,因为您已经将auto_now 设置为true。此外,您可能想考虑auto_now_add 是否更适合您正在做的事情,因为auto_now 将在每次修改对象时更新日期。该文档包含有关字段和日期时间的所有信息

标签: python django forms


【解决方案1】:

Django 1.11

import datetime
from django import forms

class PurchaseForm(forms.Form):
    date = forms.DateTimeField(initial=datetime.datetime.now, 
        widget=forms.HiddenInput())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-17
    • 2023-03-26
    • 2010-10-11
    • 1970-01-01
    相关资源
    最近更新 更多