如何使 django 脆皮形式隐藏特定字段?
How to make django crispy form to hide a particular field?
我试图隐藏我的 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 }}
..
您可以隐藏表单中的字段 class,如下所示:
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(): ...
.
不要使用您的 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_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)
我认为这应该可行:
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
。
我试图隐藏我的 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 }}
..
您可以隐藏表单中的字段 class,如下所示:
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(): ...
.
不要使用您的 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_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)
我认为这应该可行:
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
。