代码之家  ›  专栏  ›  技术社区  ›  Avinash Raj

如何使django脆皮形状隐藏特定字段?

  •  8
  • Avinash Raj  · 技术社区  · 10 年前

    我想让我 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>
    

    此窗体显示 修改日期 领域但我不希望这个字段位于前端,而是希望模型或db_table中这个字段的值应该得到更新。我知道如何在jquery中隐藏这个特定字段,但我不想接触那些js工具。有什么办法 crispy 排除特定字段,如 {{ form|crispy|exclude:date_modified }} ..

    3 回复  |  直到 10 年前
        1
  •  7
  •   Muhammad Tahir    10 年前

    而不是使用您的 UpdateView 将隐式使用,创建自定义窗体。并在自定义窗体中更改 date_modified 领域

    在您的表单中.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')
    

    自动更新 修改日期 每当更新记录时,都需要使用属性 auto_now 和 auto_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
  •  7
  •   Pouria    10 年前

    您可以在窗体类中隐藏字段,如下所示:

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

        3
  •  2
  •   doru    10 年前

    我认为这应该有效:

    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')
    

    看见 here modelform_factory .