Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Django
  • » Присвоение новой записи в БД собственного адреса [RSS Feed]

#1 Янв. 28, 2013 19:11:03

dnstuff
Зарегистрирован: 2012-11-05
Сообщения: 113
Репутация: +  1  -
Профиль   Отправить e-mail  

Присвоение новой записи в БД собственного адреса

Здравствуйте!
Начал изучать Django, рассматриваю классический пример с бложиком.
Модель:

class BlogPost(models.Model):
	title=models.CharField(max_length=150)
	body=models.TextField()
	timestamp=models.DateTimeField()
	class Meta:
		ordering=('-timestamp',)
class BlogPostAdmin(admin.ModelAdmin):
	list_display=('title', 'timestamp')
Вывожу посты в обратной последовательности на страницу:
news.html
{% extends "main.html" %}
{% load staticfiles %}
{% block newsblog %}
{% for post in posts1 %}
<h2>{{post.title}}</h2>
<p>{{post.timestamp}}</p>
<p>{{post.body}}</p>
{% endfor %}
{% endblock %}
Задался вопросом, а как присвоить каждому посту свой url? Сам сообразить не могу, в каком направлении двигаться хотябы.
Спасибо!

Офлайн

#2 Янв. 28, 2013 21:43:50

inoks
От: Russia
Зарегистрирован: 2012-12-11
Сообщения: 343
Репутация: +  35  -
Профиль   Адрес электронной почты  

Присвоение новой записи в БД собственного адреса

Посмотрите более полный пример, например этот:
http://www.djangorocks.com/tutorials/how-to-create-a-basic-blog-in-django/defining-your-models.html

Офлайн

#3 Фев. 15, 2013 10:58:38

dnstuff
Зарегистрирован: 2012-11-05
Сообщения: 113
Репутация: +  1  -
Профиль   Отправить e-mail  

Присвоение новой записи в БД собственного адреса

Спасибо! Полезный был пример, но надо двигаться дальше.
Сейчас стоит задача разместить на странице две последние новости из категории 1, и две из категории 2.
model.py

class Blog(models.Model):
    title = models.CharField(max_length=100, unique=True)
    slug = models.SlugField(max_length=100, unique=True)
    description=models.TextField(max_length=300)
    body = models.TextField()
    timestamp=models.DateTimeField(db_index=True)
    category = models.ForeignKey('auto.Category')
    hot = models.BooleanField(default=False)
    class Meta:
        ordering=('-timestamp',)
    def __unicode__(self):
        return '%s' % self.title
    @permalink
    def get_absolute_url(self):
        return ('view_blog_post', None, { 'slug': self.slug })
class Category(models.Model):
    title = models.CharField(max_length=100, db_index=True)
    slug = models.SlugField(max_length=100, db_index=True)
    def __unicode__(self):
        return '%s' % self.title
    @permalink
    def get_absolute_url(self):
        return ('view_blog_category', None, { 'slug': self.slug })
views:
def view_category(request, slug):
	category = get_object_or_404(Category, slug=slug)
	return render_to_response('home.html', {
		'category': category,
		'posts': Blog.objects.filter(category=category)
	})
def view_post(request, slug):   
	return render_to_response('post.html', {
		'post': get_object_or_404(Blog, slug=slug)
	})
urls:
 url(r'^news/(?P<slug>[^\.]+).html', view_post, name='view_blog_post'),
    url(r'^(?P<slug>[^\.]+).html', view_category, name='view_blog_category'),
У меня проблема в том, как передать в один url сразу две выборки. Из категорий 1 и 2. Как правильно построить view/url для такого случая?
Спасибо!

Офлайн

#4 Фев. 15, 2013 20:06:31

ilnur
От: Казань
Зарегистрирован: 2009-01-06
Сообщения: 524
Репутация: +  22  -
Профиль   Отправить e-mail  

Присвоение новой записи в БД собственного адреса

def view_category(request, slug):
	category = get_object_or_404(Category, slug=slug)
	return render_to_response('home.html', {
		'category': category,
		'posts': Blog.objects.filter(category=category)
	})
вот тут вы же сделали одну выборку. сделайте там же вторую выборку и передайте в шаблон.
def view_category(request, slug):
	category = get_object_or_404(Category, slug=slug)
	return render_to_response('home.html', {
		'category': category,
		'posts': Blog.objects.filter(category=category),
                            # вот тут например сделайте выборкуи передайте
	})

Отредактировано ilnur (Фев. 15, 2013 20:14:27)

Офлайн

#5 Фев. 16, 2013 01:09:25

nnmware
Зарегистрирован: 2012-07-21
Сообщения: 133
Репутация: +  13  -
Профиль   Отправить e-mail  

Присвоение новой записи в БД собственного адреса

А если так.

url(r'^categories/(?P<slug1>[^\.]+)/(?P<slug2>[^\.]+)/$', view_2_categories, name='category_2')

Вьюха
def view_2_categories(request, slug1, slug2):
    categories = Category.objects.filter(slug__in=[slug1,slug2])
    return render_to_response('home.html', { 'categories': categories})

А в шаблоне использовать template tag, что нибудь типо
@register.assignment_tag
def get_2_blog(category):
    return Blog.objects.filter(category=category).order_by('-timestamp')[:2]
и в шаблоне
{% for cat in categories %}
    {% get_2_blog cat as cat_blogs %}{% for blog in cat_blogs %}выводим ньюс {% endfor %}
{% endfor %}

Или если код никому показывать не будете, можно просто у категории метод написать
def get_2_blog(self):
    return Blog.objects.filter(category=self).order_by('-timestamp')[:2]
Тогда в шаблоне
{% for cat in categories %}
    {% for blog in cat.get_2_blog %}выводим ньюс {% endfor %}
{% endfor %}
Но далеко не факт что это самое лучшее решение. Не стреляйте в музыканта (с)
UPD: И вообще уже на CBV можно по-модному
class Category2View(ListView):
    template_name = "home.html"
    def get_queryset(self):
        return Category.objects.filter(slug__in=[self.kwargs['slug1'],self.kwargs['slug2']])
Урл соответственно
url(r'^categories/(?P<slug1>[^\.]+)/(?P<slug2>[^\.]+)/$', Category2View.as_view(), name='category_2')
Ну и в шаблоне итерацию тогда делать не по categories, а по object_list {% for cat in object_list %} остальное так же

Отредактировано nnmware (Фев. 16, 2013 01:42:25)

Офлайн

#6 Фев. 17, 2013 09:49:34

dnstuff
Зарегистрирован: 2012-11-05
Сообщения: 113
Репутация: +  1  -
Профиль   Отправить e-mail  

Присвоение новой записи в БД собственного адреса

Вот первый рабочий вариант:

def view_category(request, slug):
	category = get_object_or_404(Category, slug=slug)
	category1=Category.objects.all()[0]
	category2=Category.objects.all()[1]
	return render_to_response('home.html', {
		'category': category,
		'posts': Blog.objects.filter(category=category),
		'posts1': Blog.objects.filter(category=category1)[:2],
		'posts2': Blog.objects.filter(category=category2)[:2],
	})

Офлайн

#7 Фев. 17, 2013 10:08:08

truporez
От:
Зарегистрирован: 2009-05-08
Сообщения: 266
Репутация: +  6  -
Профиль   Адрес электронной почты  

Присвоение новой записи в БД собственного адреса

Уродливый код, основанный на многих допущениях: на порядке категорий в queryset'е, на количестве категорий в базе.



Офлайн

  • Начало
  • » Django
  • » Присвоение новой записи в БД собственного адреса[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version