我有一个使用ContentType
和GenericForeignKey
的评论模型,以便可以将评论附加到任意模型的实例:
class Comment(models.Model):
...
text = models.TextField()
target_content_type = models.ForeignKey(ContentType, related_name='comment_target',
null=True, blank=True)
target_object_id = models.PositiveIntegerField(null=True, blank=True)
target_object = GenericForeignKey("target_content_type", "target_object_id")
我有一个用于创建评论的表单:
class CommentForm(forms.Form):
new_comment = forms.CharField(widget=forms.Textarea(attrs={'rows':2}))
表单的使用方式如下:
<form method="POST" action="{% url 'comments:create' %}">{% csrf_token %}
{{ form | crispy }}
<input type='hidden' name = 'target_id' value='{{q.id}}' />
<input type='submit' class='btn btn-primary' value='Add reply' />
</form>
在我的“创建”视图中,如何获取原始对象的模型,或ContentType
&amp; id,这样我就可以创建一个新的评论?
def comment_create(request):
if request.method == "POST":
if form.is_valid():
text = form.cleaned_data.get('new_comment')
target_object_id = request.POST.get('target_id')
target_content_type = ?
...
答案 0 :(得分:1)
生成表单时,添加一个隐藏字段,该字段还包含内容类型ID。
然后你可以从那里查询内置的Django ContentType
模型,如下所示:
from django.contrib.contenttypes.models import ContentType
my_model = ContentType.objects.get(id=some_id).model_class()
至于如何获取内容类型ID,因为您不能使用带参数的方法,您可以更改表单的构造方式(添加隐藏字段并填充默认值(更好的方式)或创建一个模板标签,作为辅助函数来填充html模板中的隐藏字段(更简单的方法)。
在任何一种情况下,您都可以再次使用ContentType
来调用它:
ct = ContentType.objects.get_for_model(my_item)