Найти - Пользователи
Полная версия: Присвоение новой записи в БД собственного адреса
Начало » Django » Присвоение новой записи в БД собственного адреса
1
dnstuff
Здравствуйте!
Начал изучать 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? Сам сообразить не могу, в каком направлении двигаться хотябы.
Спасибо!
inoks
Посмотрите более полный пример, например этот:
http://www.djangorocks.com/tutorials/how-to-create-a-basic-blog-in-django/defining-your-models.html
dnstuff
Спасибо! Полезный был пример, но надо двигаться дальше.
Сейчас стоит задача разместить на странице две последние новости из категории 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 для такого случая?
Спасибо!
ilnur
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),
                            # вот тут например сделайте выборкуи передайте
	})
nnmware
А если так.
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 %} остальное так же
dnstuff
Вот первый рабочий вариант:
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],
	})
truporez
Уродливый код, основанный на многих допущениях: на порядке категорий в queryset'е, на количестве категорий в базе.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB