Форум сайта python.su
Привет.
Есть models.py:
from django.db import models
from django.contrib.auth.models import User
class Tag(models.Model):
tag_name = models.CharField(max_length=30)
def __unicode__(self):
return self.tag_name
def __str__(self):
return self.tag_name
class Comments(models.Model):
comment_author = models.ForeignKey(User)
comment_image = models.ForeignKey(Images)
comment_title = models.CharField(max_length=50)
comment_pubdate = models.DateTimeField()
comment_text = models.TextField()
def __unicode__(self):
return '%s (%s)' % (self.comment_title, self.comment_author)
class Images(models.Model):
image_author = models.ForeignKey(User)
image_title = models.CharField(max_length=30)
image_description = models.TextField(blank=True)
image_pubdate = models.DateTimeField()
image_source = models.ImageField(upload_to='images/')
image_tags = models.ManyToManyField(Tag, blank=True)
image_comments = models.ManyToManyField(Comments, blank=True)
def __unicode__(self):
return '%s (%s)' % (self.image_title, self.image_author)
Офлайн
Насколько я понимаю, для вашего случая будет вполне достаточно отношения ManyToOne (Которое представляется полем ForeignKey)
...
comment_image = models.ForeignKey(Images)
# если лень переместить модель вниз, можно взять название модели в кавычки
comment_image = models.ForeignKey('Images')
...
# получить список всех комментов:
Image_obj.comments_set.all()
# если название comments_set не нравиться можно вбить related_name и обращаться по нему:
comment_image = models.ForeignKey('Images', related_name='comments')
Image_obj.comments.count()
Отредактировано (Июнь 8, 2011 12:34:06)
Офлайн
pillСпасибо! Но я не понял как я могу это прикрутить к своей модели и что это мне даст?
Насколько я понимаю, для вашего случая будет вполне достаточно отношения ManyToOne (Которое представляется полем ForeignKey)https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.ForeignKey.related_name...
comment_image = models.ForeignKey(Images)
# если лень переместить модель вниз, можно взять название модели в кавычки
comment_image = models.ForeignKey('Images')
...
# получить список всех комментов:
Image_obj.comments_set.all()
# если название comments_set не нравиться можно вбить related_name и обращаться по нему:
comment_image = models.ForeignKey('Images', related_name='comments')
Image_obj.comments.count()
https://docs.djangoproject.com/en/dev/topics/db/queries/#backwards-related-objects
Офлайн
Как то так:
from django.db import models
from django.contrib.auth.models import User
class Tag(models.Model):
tag_name = models.CharField(max_length=30)
def __unicode__(self):
return self.tag_name
def __str__(self):
return self.tag_name
class Comments(models.Model):
comment_author = models.ForeignKey(User)
comment_image = models.ForeignKey('Images') # название модели берем в кавычки что-бы не ругалось на не объявленную модель
comment_title = models.CharField(max_length=50)
comment_pubdate = models.DateTimeField()
comment_text = models.TextField()
def __unicode__(self):
return '%s (%s)' % (self.comment_title, self.comment_author)
class Images(models.Model):
image_author = models.ForeignKey(User)
image_title = models.CharField(max_length=30)
image_description = models.TextField(blank=True)
image_pubdate = models.DateTimeField()
image_source = models.ImageField(upload_to='images/')
image_tags = models.ManyToManyField(Tag, blank=True)
# ManyToMany убираем
def __unicode__(self):
return '%s (%s)' % (self.image_title, self.image_author)
...
def imagesAndCommentsForCurrentUser(request):
imgs = Images.objects.filter(image_user=request.user)
return render_to_response(
'template.html',
{'images': imgs,},
context_instance=RequestContext(request)
)
...
# В темплейте:
...
{% for img in images %}
<img src="{{img.image_source}}">
...
{% for comment in img.comments_set %}
...
<p>{{comment.comment_title}}</p>
<p>{{comment.comment_text}}</p>
<hr>
....
{% endfor %}
{% endfor %}
Отредактировано (Июнь 8, 2011 14:04:39)
Офлайн
pillПолучается тоже самое, только без использования ManyToMany, а с использованием сетов!
Как то так…
Отредактировано (Июнь 9, 2011 07:05:19)
Офлайн
Что - то не выводятся комментарии.
В этом случае комментарии никак не связаны с рисунками, я думаю поэтому ничего не выводится.
А как их связать без ManyToMany?
Вот что у меня получилось:
models.py
from django.db import models
from django.contrib.auth.models import User
class Tag(models.Model):
tag_name = models.CharField(max_length=30)
def __unicode__(self):
return self.tag_name
def __str__(self):
return self.tag_name
class Comments(models.Model):
comment_author = models.ForeignKey(User)
comment_title = models.CharField(max_length=50)
comment_pubdate = models.DateTimeField()
comment_text = models.TextField()
def __unicode__(self):
return '%s (%s)' % (self.comment_title, self.comment_author)
class Images(models.Model):
image_author = models.ForeignKey(User)
image_title = models.CharField(max_length=30)
image_description = models.TextField(blank=True)
image_pubdate = models.DateTimeField()
image_source = models.ImageField(upload_to='images/')
image_tags = models.ManyToManyField(Tag, blank=True)
def __unicode__(self):
return '%s (%s)' % (self.image_title, self.image_author)
from django.shortcuts import render_to_response
#from django.shortcuts import TemplateResponse
from django.http import HttpResponse
from django.template.context import RequestContext
from RandomQuote.quotes.models import Comments, Tag, Images
import random
def showImage(request):
albums = Images.objects.select_related().all()
photo = albums.get(pk=random.randrange(1,albums.count()+1))
#return render_to_response('main_template.html', {'images': photo})
#return TemplateResponse('main_template.html', {'images': photo})
return render_to_response('main_template.html',{'images': photo},
context_instance=RequestContext(request))
<TABLE cellpadding="0" cellspacing="0" border="0" width="1000">
<TR>
<TD>
<TABLE cellpadding="0" cellspacing="0" border="0">
<TR><TD>Автор: </TD><TD>{{ images.image_author }}</TD></TR>
<TR><TD>Название: </TD><TD>{{ images.image_title }}</TD></TR>
<TR><TD>Описание: </TD><TD>{{ images.image_description }}</TD></TR>
<TR><TD>Дата публикации: </TD><TD>{{ images.image_pubdate }}</TD></TR>
<TR><TD>Теги:
{% if images.image_tags %}
{% for tag in images.image_tags.all %}
<li>{{ tag }}</li>
{% endfor %}
{% endif %}
</TD></TR>
</TABLE>
</TD>
<TD>
<img src="{{ MEDIA_URL }}/{{ images.image_source }}" border="0">
</TD>
</TR>
<TR>
<TD>Здесь будет форма добавления комментария</TD>
</TR>
<TR>
<TD>
{% for comment in images.comments_set %}
{{comment.comment_title}}
{{comment.comment_text}}
{% endfor %}
</TD>
</TR>
</TABLE>
Офлайн
Дык, а зачем вы поле “comment_image = models.ForeignKey('Images')” из модели коммента убрали?
Различия ManyToMany и ManyToOne Вкратце: http://www.berghowto.info/django-blog/2011/05/08/many-many-i-many-one-relationships-v-django/
Отредактировано (Июнь 9, 2011 09:29:28)
Офлайн