2016-02-08 18 views
3

我试图让我的date_modified字段隐藏起来,因为我已经通过datetime.now参数来定义模型中的date_modified字段。如何让Django的脆皮形式隐藏一个特定的领域?

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 }}特定领域..

+0

永久或暂时? – Pouria

+0

我希望该字段只能隐藏在特定的表单上。“ –

+0

”对应的表单forms.py看起来像“它是.html模板。我认为你没有forms.py,因为你没有定义自定义表单。 –

回答

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) 
+0

是我们需要在这两个视图和forms.py? –

+0

中定义'Guide'模型通过在'class GuideForm(forms.ModelForm):'和'GuideFormUpdateView(UpdateView):'类中定义是否意指语句'model = Guide':'yes yes in –

+0

刚才我注意到如果进行更新,我的'date_modified'字段将不会被更新,我需要手动更新它,有没有什么办法呢?想想我需要覆盖POST方法。 –

2

:凡Fieldcrispy_forms.layout

不要

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

不要忘记,如果他的领域不能留空,你仍然需要在保存之前传递一个合适的值。

摘要例如:

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

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

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

+0

所以,我需要创建一个单独的Form类? –

+0

你可以做到这一点,或把它放在一个条件;或者在发布表单时更改实现,或者继承表单类并将其添加到表单中。有很多方法可以在不创建全新表单的情况下执行此操作。另一种方法是在实施时使用JavaScript来隐藏它。 – Pouria

+0

我会添加一个简短的例子。 – Pouria

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

+0

谢谢,我会在必要时使用它。 –