3

我正在尝试创建一个评论应用程序,以便在需要它的任何地方使用它,所以我想我必须使用它ContentType来将评论附加到我的项目的不同模型上。所以在这里:

我的model

class Comment(models.Model):
    user = models.ForeignKey(User, blank=True, null=True)
    text = models.TextField((u'Текст комментария'))
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey('content_type', 'object_id')

我的view

def add_comment(request):
    if request.method == 'POST':
        form = CommentForm(request.POST)

        if form.is_valid():
            new_comment = Comment()
            new_comment.text = request.POST['text']
            new_comment.content_type = ???
            new_comment.object_id = request.POST['object_id']
            new_comment.user = request.user
            new_comment.save()
            return HttpResponseRedirect(request.META['HTTP_REFERER'])
    else: ...

如何获得我正在使用的当前模型的内容类型?我有应用程序 NEWS 和模型帖子,所以我想评论我的帖子。

我知道我可以使用ContentType.objects.get(app_label="news", model="post"),但我得到了确切的价值,所以这样我的评论应用程序就不会是多用途的。

PS抱歉英语不好。

4

1 回答 1

3

Check django.contrib.comments.forms.CommentForm.get_comment_create_data:它返回一个映射,用于创建未保存的评论实例:

return dict(
    content_type = ContentType.objects.get_for_model(self.target_object),
    object_pk    = force_unicode(self.target_object._get_pk_val()),
    user_name    = self.cleaned_data["name"],
    user_email   = self.cleaned_data["email"],
    user_url     = self.cleaned_data["url"],
    comment      = self.cleaned_data["comment"],
    submit_date  = datetime.datetime.now(),
    site_id      = settings.SITE_ID,
    is_public    = True,
    is_removed   = False,
)

所以我猜你正在寻找的线路是:

content_type = ContentType.objects.get_for_model(self.target_object),

记住,self是表单实例,并self.target_object()返回当前注释附加到的实例。

于 2011-06-07T16:28:05.420 回答