如何在FormMixin和DetailView中设置初始数据



我想使用通用foreignkey创建一个注释表单,但在获取表单中object_id和content_type的初始数据时遇到了问题?

class Comment(models.Model):
user    =   models.ForeignKey(User, on_delete=models.CASCADE)
content_type=   models.ForeignKey(ContentType, on_delete=models.CASCADE)
object_id   =   models.PositiveIntegerField()
content_object=   GenericForeignKey()
parent=   models.ForeignKey("self", null=True, blank=True, on_delete=models.CASCADE)
content  =   RichTextField()
time_stamp  =   models.DateTimeField(auto_now_add=True)

Forms.py

class CommentsForm(forms.ModelForm):
content_type    =   forms.CharField(widget=forms.HiddenInput)
object_id       =   forms.IntegerField(widget=forms.HiddenInput)
content         =   forms.CharField(widget=forms.Textarea(attrs={
'class':'form-control',
'cols':'4',
'rows':'3'
}))
class Meta:
model   =   Comment
fields  =   ['content','user','object_id', 'content_type']

Views.py

class SongDetail(FormMixin, DetailView):
model       =   Song
form_class  =   CommentsForm
def post(self, request, *args, **kwargs):
obj = self.get_object()
if not request.user.is_authenticated:
return redirect('music:obj.get_absolute_url()')
if form.is_valid():
form.save()
return self.form_valid(form)

您可以这样尝试:

class SongDetail(ModelFormMixin, DetailView):
model       =   Song
form_class  =   CommentsForm
def get_initial(self):
obj = self.get_object()
return { 'content_type': obj.content_type, 'object_id': obj.object_id }
def post(self, request, *args, **kwargs):
if not request.user.is_authenticated:
return redirect('music:obj.get_absolute_url()')

form = self.get_form()
if form.is_valid():
return self.form_valid(form)
else:
return self.form_invalid(form)

仅供参考,我使用的是ModelFormMixin而不是FormMixin,因为它提供了内置的保存功能。

这里我重写get_initial方法,从中返回content_typeobject_id。然后这些值将被传递到表单,并作为初始值加载。

最新更新