如何制作 django 酥脆的表格来隐藏特定的字段?
Posted
技术标签:
【中文标题】如何制作 django 酥脆的表格来隐藏特定的字段?【英文标题】:How to make django crispy form to hide a particular field? 【发布时间】:2016-05-18 03:26:14 【问题描述】:我正在尝试将我的 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
这样的特定字段..
【问题讨论】:
永久还是临时? 我希望该字段仅隐藏在该特定表单上.. “对应表单forms.py的样子”是.html模板。我认为您没有 forms.py,因为您没有定义自定义表单。 @MuhammadTahir 是的,我没有forms.py
【参考方案1】:
不要使用您的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
在你的意见中.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)
【讨论】:
是不是需要在views和forms.py中都定义Guide
模型?
如果您在class GuideForm(forms.ModelForm):
和class GuideFormUpdateView(UpdateView):
中都表示model=Guide
的意思,那么在两者中都是。
刚才我注意到如果进行更新,我的date_modified
字段将不会更新。我需要手动更新它。有什么办法吗?认为我需要覆盖 POST 方法。
其实我认为你需要的是DateTimeField
的auto_now
和auto_now_add
属性,而不是datetime.now
。我正在更新我的答案。
@AvinashRaj 如果您想要快速解决方案(auto_now
和 auto_now_add
除外),请查看@doru 的答案。虽然我喜欢将我的表单代码保留在我的forms.py
中,而不是直接在我的views.py
中自定义它。【参考方案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
。
【讨论】:
【参考方案3】:您可以像这样在表单类中隐藏字段:
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(): ...
。
【讨论】:
那么,我需要创建一个单独的Form类吗? 你可以这样做,或者把它放在一个条件中;或在发布表单时更改您的实现,或继承表单类并将其添加到其中。有很多方法可以做到这一点,而无需创建全新的表单。另一种方法是在实现时使用 javascript 隐藏它。 我将添加一个简短的示例。 请把上面的代码添加到一个文件(forms.py)中,因为我不知道如何......而且我需要在GuideFormUpdateView
中包含那个特定的表单类。
我无法将.py
附加到我的消息中,另外,我没有您的整个数据库、您的视图、URL、管理员、模型和设置来这样做。但是我给了你解决方案,我相信你可以解决。请注意,您可以在函数内部操作类,但最好不要。以上是关于如何制作 django 酥脆的表格来隐藏特定的字段?的主要内容,如果未能解决你的问题,请参考以下文章