如何制作 django 酥脆的表格来隐藏特定的字段?

Posted

技术标签:

【中文标题】如何制作 django 酥脆的表格来隐藏特定的字段?【英文标题】:How to make django crispy form to hide a particular field? 【发布时间】:2016-05-18 03:26:14 【问题描述】:

我正在尝试将我的 date_modified 字段设为隐藏,因为我在模型中定义 date_modified 字段时传递了 datetime.now 参数。

model.py

class Guide(models.Model):
    name = models.CharField(max_length=50)
    sno = models.CharField(max_length=50)
    date_created = models.DateTimeField(default=datetime.now, blank=True)
    date_modified = models.DateTimeField(default=datetime.now, blank=True)

    def __unicode__(self):
        return unicode(self.name)

views.py

class GuideFormUpdateView(UpdateView):
    model = Guide
    fields = ['name', 'sno', 'date_modified']
    template_name_suffix = '_update_form'
    success_url = reverse_lazy('Guides')

对应的表格forms.py看起来像

<form role="form" method="POST" action="% url 'Guideform-edit' object.pk %"
              class="post-form form-horizontal" enctype="multipart/form-data">% csrf_token %
 form|crispy 
<button type="submit" value="Upload" class="save btn btn-default btn-primary center-block">Update</button>

        </form>

此表单显示date_modified 字段。但是我不想在前端使用这个字段,而是希望模型或 db_table 中的这个字段的值应该得到更新。我知道如何在 jquery 中隐藏这个特定字段,但我不想碰那些 js 工具。有没有办法让crispy 排除像 form|crispy|exclude:date_modified 这样的特定字段..

【问题讨论】:

永久还是临时? 我希望该字段仅隐藏在该特定表单上.. “对应表单forms.py的样子”是.html模板。我认为您没有 forms.py,因为您没有定义自定义表单。 @MuhammadTahir 是的,我没有forms.py 【参考方案1】:

不要使用您的UpdateView 将隐式使用的通用表单,而是创建您的自定义表单。并在您的自定义表单中更改 date_modified 字段的小部件。

在你的 forms.py 中

from django.forms import ModelForm, HiddenInput
class GuideForm(ModelForm):
    def __init__(self, *args, **kwargs):
        super(GuideForm, self).__init__(*args, **kwargs)
        self.fields['date_modified'].widget = HiddenInput()

    class Meta:
        fields = ('name', 'sno', 'date_modified', )
        model = models.Guide

在你的意见中.py

class GuideFormUpdateView(UpdateView):
    model = Guide
    form_class = forms.GuideForm
    template_name_suffix = '_update_form'
    success_url = reverse_lazy('Guides')

要在更新记录时自动更新date_modified,您需要使用属性auto_nowauto_now_add 而不是default。见Docs。所以你的模型将是

class Guide(models.Model):
    name = models.CharField(max_length=50)
    sno = models.CharField(max_length=50)
    date_created = models.DateTimeField(auto_now_add=True, blank=True)
    date_modified = models.DateTimeField(auto_now=True, blank=True)

    def __unicode__(self):
        return unicode(self.name)

【讨论】:

是不是需要在views和forms.py中都定义Guide模型? 如果您在class GuideForm(forms.ModelForm):class GuideFormUpdateView(UpdateView): 中都表示model=Guide 的意思,那么在两者中都是。 刚才我注意到如果进行更新,我的date_modified 字段将不会更新。我需要手动更新它。有什么办法吗?认为我需要覆盖 POST 方法。 其实我认为你需要的是DateTimeFieldauto_nowauto_now_add 属性,而不是datetime.now。我正在更新我的答案。 @AvinashRaj 如果您想要快速解决方案(auto_nowauto_now_add 除外),请查看@doru 的答案。虽然我喜欢将我的表单代码保留在我的forms.py 中,而不是直接在我的views.py 中自定义它。【参考方案2】:

我认为这应该可行:

from django.forms.models import modelform_factory

class GuideFormUpdateView(UpdateView):
    model = Guide
    form_class = modelform_factory(Guide, widgets="date_modified": HiddenInput )
    fields = ['name', 'sno', 'date_modified']
    template_name_suffix = '_update_form'
    success_url = reverse_lazy('Guides')

见heremodelform_factory

【讨论】:

【参考方案3】:

您可以像这样在表单类中隐藏字段:

Field('field_name', type="hidden")

Field 来自crispy_forms.layout

不要忘记,如果他的字段不能为空,您仍然需要在保存之前传递一个适当的值。

抽象例子:

class GuideFormHiddenField(GuideFormUpdateView):
    def __init__(self, *args, *kwargs):

        Field('date_modified', type="hidden")

这是最简单的方法。您当然可以制作一个全新的表单,或单独实现您的字段,并使用条件来确定某个字段的可见性;类似于 if User.is_authenticated(): ...

【讨论】:

那么,我需要创建一个单独的Form类吗? 你可以这样做,或者把它放在一个条件中;或在发布表单时更改您的实现,或继承表单类并将其添加到其中。有很多方法可以做到这一点,而无需创建全新的表单。另一种方法是在实现时使用 javascript 隐藏它。 我将添加一个简短的示例。 请把上面的代码添加到一个文件(forms.py)中,因为我不知道如何......而且我需要在GuideFormUpdateView中包含那个特定的表单类。 我无法将.py 附加到我的消息中,另外,我没有您的整个数据库、您的视图、URL、管理员、模型和设置来这样做。但是我给了你解决方案,我相信你可以解决。请注意,您可以在函数内部操作类,但最好不要。

以上是关于如何制作 django 酥脆的表格来隐藏特定的字段?的主要内容,如果未能解决你的问题,请参考以下文章

字段标签酥脆形式 Django

如何以酥脆的形式在日期字段上显示日期选择器日历?

如何使用清晰的表单在一行上显示 Django SelectDateWidget

如何在django-admin中隐藏特定记录的字段?

Django 酥脆的表单可以与自定义小部件一起使用吗?

如果在下拉列表中选择了特定值,则 Django 管理员显示/隐藏字段