python - Django:如何从 POST 请求获取任意模型

标签 python django django-models django-views

我有一个使用 ContentTypeGenericForeignKey 的评论模型,以便可以将评论附加到任意模型的实例:

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>

在我的“创建” View 中,如何获取原始对象的模型或 ContentType 和 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 = ?
        ...

最佳答案

生成表单时,添加一个还包含内容类型 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)

Credit to this question.

关于python - Django:如何从 POST 请求获取任意模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32110316/

相关文章:

python - 在 Python 中,为什么可以使用默认参数时使用 "val = param or None'?

javascript - 错误 : AttributeError: 'coroutine' object has no attribute 'newPage' when doing youtube webscraping

python - 错误 : "can only concatenate tuple (not "list") to tuple"in urls, Django

python - 在 Tornado 中使用 Django ORM, "syncdb"不起作用

python - Discord py - 如何提高代码速度?

python - 仅通过电子邮件地址使用 gmail api 访问用户个人资料信息

django - 使用类似于 Rails JST 的 Django 管道分配 Backbone 模板?

python - 在 django 中,如何从初始化脚本中调用子命令 'syncdb'?

django - 合并模型字段

django - 记录所有 django 模型中的所有保存/更新/删除操作