[英]Django - ModelForm Dynamic field update
我正在尝试更新某些字段的ModelForm,这些字段是不固定的。 (我只有由视图自动填充的tutor
)
模型:
class Session(models.Model):
tutor = models.ForeignKey(User)
start_time = models.DateTimeField()
end_time = models.DateTimeField()
status = models.CharField(max_length=1)
形成:
class SessionForm(forms.ModelForm):
class Meta:
model = Session
exclude = ['tutor']
对于给定的会话,有时我只需要更新end_time
,有时只需要更新start_time
和end_time
。
我该怎么做呢?
编辑
我已经给出了示例,但不仅限于这些示例,我需要更新的字段不是预定义的,我需要能够更新任何字段
我之前不得不做类似的事情,虽然它并不十分漂亮,但是却非常有效。 它涉及在运行时动态创建一个类型并使用该类型。 有关某些文档,您可以参阅django的DynamicModels。
我们来了..您的要求。
因此,一些代码:
def create_form(model, field_names):
# the inner class is the only useful bit of your ModelForm
class Meta:
pass
setattr(Meta, 'model', model)
setattr(Meta, 'include', field_names)
attrs = {'Meta': Meta}
name = 'DynamicForm'
baseclasses = (forms.ModelForm,)
form = type('DynamicForm', baseclasses, attrs)
return form
def my_awesome_view(request):
fields = ['start_time', 'end_time']
form = create_form(Session, fields)
# work with your form!
将表单字段设置为可为空,并使用“ clean”方法将逻辑添加到字段ex:
class SessionForm(forms.ModelForm):
def clean_end_date(self):
cd = self.cleaned_data
if (cd["start_date"] and cd["end_date"]) and cd["end_date"] < cd["start_date"]:
raise forms.ValidationError("WTF?!")
if not (cd["start_date"] or cd["end_date"]):
raise forms.ValidationError("need one date")
return cd['end_date']
如果要更改值,请对return语句使用其他值。
这就是您可能需要的验证。
如果需要,可以在实例化表格之前复制GET词典并更新值
def my_view(request):
r_data = request.GET.copy()
r_data.merge(request.POST)
data = dict([(key, my_function(key, value)) for key, value in r_data.iteritems() if key in MyForm.fields])
form = MyForm(data=data)
[...]
希望对您有所帮助。
您可以像这样调用表单的构造函数:
class SessionForm(forms.ModelForm):
class Meta:
model = Session
exclude = ['tutor', 'start_time']
def __init__(self, your_extra_args, *args, **kwargs):
super(SessionForm, self).__init__(*args, **kwargs)
if need_end_time_start_time(your_extra_args):
self.fields['start_time'] = forms.DateTimeField()
要使用此类,您必须将参数“ your_extra_args”传递给表单:
session_form = SessionForm('foo')
您的问题表明您有一个使用相同模型的需求,但根据需要,您的ModelForm中隐藏了不同的字段。
如果我理解您的问题,那么您需要创建两个不同的基于ModelForm的类,这两个类在Meta类中都具有相同的模型值。 排除并包括您需要的字段。 所以现在您有了不同的ModelForm类,可以在视图逻辑中调用它们。
这样,您将有两种不同的形式,它们依赖于同一模型,具有不同的默认字段。
通过巧妙的URL和视图设计,您将能够使用上述想法为同一模型提供多种表单。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.