我正在尝试隐藏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 }}
..
答案 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_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 :(得分: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')
。