2016-06-25 9 views
2

Я разработал приложение блога django, используя учебник djangogirls.com. Я пытаюсь добавить категорию блога, но я просто не могу этого сделать!Как добавить категории в мой блог django

Я искал google и stackoverflow.com как сумасшедший, но, будучи новичком в python/django, я не смог успешно добавить категории в свой блог.

Мои модели:

from django.db import models 
from django.utils import timezone 

class Post(models.Model): 
    author = models.ForeignKey('auth.User') 
    title = models.CharField(max_length=200) 
    text = models.TextField() 
    created_date = models.DateTimeField(
      default=timezone.now) 
    published_date = models.DateTimeField(
      blank=True, null=True) 

def publish(self): 
    self.published_date = timezone.now() 
    self.save() 

def __str__(self): 
    return self.title 

Мои просмотров:

from django.shortcuts import render, get_object_or_404 
from django.utils import timezone 
from .models import Post 

def post_list(request): 
posts = Post.objects.filter(published_date__lte=timezone.now()).order_by('published_date') 
return render(request, 'blog/post_list.html', {'posts': posts}) 

def post_detail(request, pk): 
    post = get_object_or_404(Post, pk=pk) 
    return render(request, 'blog/post_detail.html', {'post': post}) 

Мои URLs:

from django.conf.urls import include, url 
from . import views 

urlpatterns = [ 
    url(r'^$', views.post_list, name='post_list'), 
    url(r'^post/(?P<pk>\d+)/$', views.post_detail, name='post_detail'), 
] 

Мой post_list.html: {% распространяется 'блог/base.html' %}

{% block content %} 
    {% for post in posts %} 
     <div class="post"> 
      <div class="date"> 
       {{ post.published_date }} 
      </div> 
       <h1><a href="{% url 'post_detail' pk=post.pk %}">{{post.title }}</a></h1> 
     <p>{{ post.text|truncatewords:100}}</p> 
    </div> 
    {% endfor %} 
{% endblock %} 

Мой post_detail.html:

{% extends 'blog/base.html' %} 

{% block content %} 
    <div class="post"> 
     {% if post.published_date %} 
      <div class="date"> 
       {{ post.published_date }} 
      </div> 
     {% endif %} 
     <h1>{{ post.title }}</h1> 
    <p>{{ post.text|linebreaks }}</p> 
</div> 
{% endblock %} 

Ok. Если кто-то может мне помочь, мне нужно создать модель категории для этой модели блога, я бы очень признателен! Спасибо заранее!

ответ

5

Я бы с

class Category(models.Model): 
    title = models.CharField(max_length=255, verbose_name="Title") 
    ... 


class Post(models.Model): 
    category = models.ForeignKey(Category, verbose_name="Category") 
    title = models.CharField(max_length=255, verbose_name="Title") 
    text = models.TextField() 
    ... 

Если у вас есть пост, как это:

post = Post.objects.first() 

вы можете получить доступ к нему это название категории с post.category.title или когда у вас есть категории, как это:

category = Category.objects.first() 

вы можете получить сообщения по этой категории с category.post_set.all().


Я отредактировал ваш код, чтобы показать, как я буду писать, если это был проект, над которым я работаю. Вот оно:

models.py

from django.db import models 
from django.utils import timezone 

class Category(models.Model): 
    created_at = models.DateTimeField(auto_now_add=True, verbose_name="Created at") 
    updated_at = models.DateTimeField(auto_now=True, verbose_name="Updated at") 
    title = models.CharField(max_length=255, verbose_name="Title") 

    class Meta: 
     verbose_name = "Category" 
     verbose_name_plural = "Categories" 
     ordering = ['title'] 

    def __str__(self): 
     return self.title 

class Post(models.Model): 
    created_at = models.DateTimeField(auto_now_add=True, verbose_name="Created at") 
    updated_at = models.DateTimeField(auto_now=True, verbose_name="Updated at") 
    is_published = models.BooleanField(default=False, verbose_name="Is published?") 
    published_at = models.DateTimeField(null=True, blank=True, editable=False, verbose_name="Published at") 
    category = models.ForeignKey(Category, verbose_name="Category") 
    author = models.ForeignKey('auth.User', verbose_name="Author") 
    title = models.CharField(max_length=200, verbose_name="Title") 
    text = models.TextField(verbose_name="Text") 

    class Meta: 
     verbose_name = "Post" 
     verbose_name_plural = "Posts" 
     ordering = ['-created_at'] 

    def publish(self): 
     self.is_published = True 
     self.published_at = timezone.now() 
     self.save() 

    def __str__(self): 
     return self.title 

views.py

from django.shortcuts import render, get_object_or_404 
from django.utils import timezone 
from .models import Category, Post 

def category_list(request): 
    categories = Category.objects.all() # this will get all categories, you can do some filtering if you need (e.g. excluding categories without posts in it) 

    return render (request, 'blog/category_list.html', {'categories': categories}) # blog/category_list.html should be the template that categories are listed. 

def category_detail(request, pk): 
    category = get_object_or_404(Category, pk=pk) 

    return render(request, 'blog/category_detail.html', {'category': category}) # in this template, you will have access to category and posts under that category by (category.post_set). 

def post_list(request): 
    posts = Post.objects.filter(published_at__lte=timezone.now()).order_by('published_at') 

    return render(request, 'blog/post_list.html', {'posts': posts}) 

def post_detail(request, pk): 
    post = get_object_or_404(Post, pk=pk) 

    return render(request, 'blog/post_detail.html', {'post': post}) 

urls.py

from django.conf.urls import include, url 
from . import views 

urlpatterns = [ 
    url(r'^category$', views.category_list, name='category_list'), 
    url(r'^category/(?P<pk>\d+)/$', views.category_detail, name='category_detail'), 
    url(r'^$', views.post_list, name='post_list'), 
    url(r'^post/(?P<pk>\d+)/$', views.post_detail, name='post_detail'), 
] 

Я не пишу шаблоны, они до вас ,

+0

Как выглядят urls.py и views.py? –

+0

Я обновил свой ответ, надеюсь, что это поможет. –

+0

Briliant! Большое вам спасибо за то, что поделились своими знаниями. Я выполнил ваш ответ, и мне удалось создать категорию в моем/admin, но теперь я не знаю, как добавить ее в шаблоны, я чувствую себя глупо, спрашивая вас, можете ли вы дать мне руку с ними. Большое спасибо! –

2

На самом деле этот метод (публикация) необходима только для Django девочек учебник, чтобы играть в скорлупе https://tutorial.djangogirls.org/en/django_orm/

def publish(self): 
    self.is_published = True 
    self.published_at = timezone.now() 
    self.save() 

Поскольку действия управляются Джанго администратора, я бы изменить

published_at = models.DateTimeField(null=True, blank=True, editable=False, verbose_name="Published at") 

Для

published_at = models.DateTimeField(null=True, blank=True, editable=True, default=timezone.now, verbose_name="Published at") 

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

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