如何在 FormMixin 和 DetailView 中设置初始数据
How to set initial data in a FormMixin and DetailView
我想使用通用外键创建一个评论表单,但是在获取表单中 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
,因为它提供了保存功能 built-in。
在这里,我将 get_initial
方法重写为 return content_type
和 object_id
。然后这些值将被传递给表单并作为初始值加载。
我想使用通用外键创建一个评论表单,但是在获取表单中 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
,因为它提供了保存功能 built-in。
在这里,我将 get_initial
方法重写为 return content_type
和 object_id
。然后这些值将被传递给表单并作为初始值加载。