我对django中的contenttype感到困惑。首先让我展示我的代码:
models.py
class Comment(models.Model):
owner = models.CharField(max_length=255)
email = models.EmailField(max_length=255)
posted_at = models.DateTimeField(auto_now_add=True)
content = models.TextField(blank=True, null=True)
contentmarkdown = models.TextField(help_text='Use Markdown syntax.')
content_type = models.ForeignKey(ContentType, limit_choices_to=models.Q(
app_label='post', model='post') | models.Q(app_label='comment',
model='comment'))
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey('content_type', 'object_id')
def save(self, *args, **kwargs):
import markdown
self.content = markdown.markdown(self.contentmarkdown)
super(Comment, self).save(*args, **kwargs)
my views.py
def create(request):
if request.method == 'POST':
print 'POST data: ', request.POST
form = CommentForm(request.POST)
#app_label, model = request.POST.get('model').split('.')
if form.is_valid():
comment = Comment()
content_type = ContentType.objects.get(app_label="comment", model="comment")
object_id = ?
comment = Comment.objects.create(
content_type = content_type,
object_id = object_id,
contentmarkdown = request.POST.get('contentmarkdown'),
owner= request.POST.get('owner'),
email = request.POST.get('email')
)
return HttpResponseRedirect("/")
urls.py
from django.conf.urls import patterns
urlpatterns = patterns('',
(r'^create/$', 'comment.views.create'),
HTML
{% load i18n %}
<div class="comment">
<form action="{% url "comment.views.create" %}" method="post">
{% csrf_token %}
{% for field in form %}
{{ field.label_tag }}
{{ field }}<p>
{% endfor %}
<input type="submit" value="{% trans "Submit" %}">
</form>
</div>
forms.py
from django import forms
from comment.models import Comment
from django.forms import ModelForm
class CommentForm(ModelForm):
def __init__(self, *args, **kwargs):
super(CommentForm, self).__init__(*args, **kwargs)
self.fields['owner'].label = 'Name'
self.fields['contentmarkdown'].label = ''
class Meta:
model = Comment
exclude = ['content', 'content_type', 'object_id' ]
现在我的问题是: 我收到了这个错误:
object_id may not be NUL
1-如何获得object_id? 2-我应该写什么object_id =? 3-如果我写这个请求,就没有像id那样的东西.POST.get(?) 请问您能告诉我如何找出object_id?
答案 0 :(得分:1)
ContentType和GenericForeignKey会出现在图片中。 假设你有商店,你卖衣服和用具。你有这两个模型。你有一个Cloth的详细页面和Utensil的详细页面。
您希望访问Cloth详细信息页面的任何人对Cloth发表评论。 同样,您希望访问Utensil详细信息页面的任何人对此特定器具发表评论。 因此,注释可以与任何这些相关联,因此您需要GenericForeignKey。
当用户对布料详细信息页面发表评论时,object_id将是布料实例的ID,而content_type将是模型Cloth
。
当用户对器具详细信息页面发表评论时,object_id将是器具实例的id,而content_type将是模型Utensil
。
评论本身不存在。它必须与某些东西有关。
再次阅读https://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/,以便更好地了解ContentType和GFK存在的原因。
假设您处于Cloth详细信息视图中,因此在将用户发送到布料详细信息页面时,您知道布料ID。在上下文中将此布料ID发送为object_id
,并在评论表单中使用
因此,您的评论表格如下:
{% load i18n %}
<div class="comment">
<form action="{% url "comment.views.create" %}" method="post">
{% csrf_token %}
{% for field in form %}
{{ field.label_tag }}
{{ field }}<p>
{% endfor %}
<input type="hidden" value="{{object_id}}" name="object_id"/>
<input type="submit" value="{% trans "Submit" %}">
</form>
</div>
在Comment创建视图中,读取此对象ID并使用它。所以,在视图中,你说:
object_id = request.POST['object_id']