如何制作django crispy form以隐藏特定的字段?

时间:2016-02-08 12:50:15

标签: python django django-forms django-crispy-forms

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

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 }} ..

这样的特定字段

3 个答案:

答案 0 :(得分:2)

您可以隐藏表单类中的字段,如下所示:

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(): ...

答案 1 :(得分:2)

不使用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

在views.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)

答案 2 :(得分:2)

我认为这应该有效:

ActivityOne.TimeCounter++;

请参阅Detect First Run 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')