我有两个模型,帖子和附件。附件有Post的外键。
我有一个PostFreateView和PostForm。
在撰写帖子时,您可以使用jquery-fileupload(AJAX)上传图像。如果上传文件,则会在<textarea>Hello World! Click "enter" for more lines...</textarea>
附加以下行。
<form>
值(1,2和3)是附件模型的PK,以便在保存帖子时在帖子和附件之间建立关系。
我能够在PostCreateView中获得一个列表:
<input type="hidden" name="attachments" value="1" />
<input type="hidden" name="attachments" value="2" />
<input type="hidden" name="attachments" value="3" />
但是,我想在PostForm中声明表单字段以进行以下验证:
帖子可能没有附件,因此附件隐藏输入标签最初不存在。这就是为什么要有一个表格领域很难。这些都附加了AJAX / jQuery。如果它很困难,我想知道在CreateView中覆盖哪种方法的最佳实践。
谢谢。
答案 0 :(得分:0)
我自己回答。
PostForm
没有Attachment
的PK隐藏字段。
PostAttachmentForm
继承PostForm
,clean_attachment()
检查列表项是否全部为整数。
class PostAttachmentForm(PostForm):
attachments = forms.IntegerField(widget=forms.HiddenInput(), required=False)
def clean_attachments(self):
data = self.data.getlist('attachments')
if not data and not all(isinstance(item, int) for item in data):
raise forms.ValidationError("PK must be integers.")
return data
PostCreateView
有get_form_class
而不是form_class
字段。
def get_form_class(self):
if self.request.method == 'POST':
# NOTE: Hidden fields must be validated.
return PostAttachmentForm
else:
# NOTE: Hidden fields are not prepopulated but appended to form by AJAX.
return PostForm
form_valid()
用于帖子和附件之间的相关性和验证
def form_valid(self, form):
response = super().form_valid(form)
# TODO: limit number
# Attachments are not related to any post yet.
attachments = Attachment.objects.filter(
pk__in=form.cleaned_data['attachments'],
post__isnull=True,
)
self.object.attachments.set(attachments)
return response
如果你有更好的方法,我真的很感激。