2016-06-25 5 views
2

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}) 

내 URL을 :

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' %}

,210

내 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 %} 

좋아. 누군가가 나를 도울 수 있다면이 블로그 모델의 카테고리 모델을 만들어야합니다. 정말 감사하겠습니다. 미리 감사드립니다.

답변

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}) 

내가 템플릿을 작성하지 않은

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'), 
] 

urls.py, 그들은 당신에게 달려있다 .조치가 장고 관리자에 의해 관리되기 때문에

+0

urls.py 및 views.py는 어떻게 표시해야합니까? –

+0

내 답변이 업데이트되었습니다. 도움이되기를 바랍니다. –

+0

Briliant! 지식을 공유해 주셔서 대단히 감사합니다. 나는 당신의 답을 따랐고 나의/admin에 카테고리를 만들 수 있었지만, 지금 템플릿에 그것을 추가하는 방법을 모르겠다. 나는 그 사람에게도 나에게 손을 줄 수 있는지 물어 보았다. 정말 고마워! –

2

사실이 방법은 (게시) 쉘에서 재생, 단지 장고 여자 튜토리얼에 필요한 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") 

새 소식을 추가하면 기본 시간이 설정되고 당신에게 어울리는 곳으로 그것을 바꿀 수있을 것입니다.