2013-09-21 3 views
0

Я путаюсь с contenttype в django. Во-первых, позвольте мне показать свои коды:Contenttype object_id не может быть NULL

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) 

мой 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

Показать комментарийДля определения определения? – mariodev

+0

Я добавил CommentForm –

+0

Вы говорите что-то показываете и исчезаете.Что это ? –

ответ

0

ContentType и GenericForeignKey поставляется в виде изображения, если вы хотите связать свою модель со многими различными моделями. Предположим, у вас есть магазин, и вы продаете одежду и посуду. У вас есть отдельная модель для этих двух. У вас есть подробная страница для ткани и подробная страница для Utensil.

Вы хотите, чтобы любой, кто посещает детальную страницу Ткань, прокомментировал Ткань. Точно так же вы хотите, чтобы любой, кто посещает детальную страницу Utensil, комментирует эту конкретную посуду. Итак, комментарий может быть связан с любым из них, поэтому вам нужен GenericForeignKey.

Когда пользователь комментирует страницу подробно, object_id будет идентификатором экземпляра ткани, а content_type будет модель Cloth.

Когда пользователь комментирует страницу с подробным описанием предметов, object_id будет идентификатором экземпляра utensil, а content_type будет модель Utensil.

Комментарий не может существовать сам по себе. Это должно быть связано с чем-то.

Снова прочитайте https://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/, чтобы лучше понять, почему ContentType и GFK существуют.

Предположим, вы находитесь в подробном представлении ткани, поэтому при отправке страницы с подробной информацией о ткани вы знаете идентификатор ткани. Отправить эту ткань идентификатор в контексте, как 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> 

И Коментарий создать представление, прочитайте этот идентификатор объекта и использовать его. Итак, на ваш взгляд, вы говорите:

object_id = request.POST['object_id'] 
+0

Я понял это, но я не знаю, как я могу получить post_id. Теперь я использую только модель Post. У меня есть сообщение, но как я могу получить post_id? Кто-то должен показать мне пример кода –

+0

Я ценю вашу помощь. Я получил эту ошибку: Key 'object_id' не найден в Итак, как я могу поместить object_id еще раз: ((((( –

+0

Отредактировано, я забыл поместить 'name = 'object_id'' на скрытый ввод. должен использовать '' –

Смежные вопросы