2017-09-03 17 views
-3

は、モデルのメソッドget_absolute_url()reverse()を使用しますが、Djangoはエラー発生させます - ?のDoesNotExistをブログ/詳細/時/ ID = 23は、ないcorrect url - "/%3Fid=23"とurlpatternsを返すbecouseときI、パターンでこれを持っていませんcorrect url - "/?id=23"が必要です。なぜこれが起こり、それを修正するのですか?ブログマッチングクエリが存在しません。 (%3Fid =)

enter image description here

urls.py(ブログアプリ)

from django.conf.urls import url 
from django.contrib.auth.decorators import permission_required 
from blog.views import BlogListView, BlogDetailView, BlogCreate, BlogUpdate, BlogDelete 

urlpatterns = [ 
    url(r'^$', BlogListView.as_view(), name = "blog"), 
    url(r'^detail/(?:\?id=(?P<blog_id>\d+))?$', BlogDetailView.as_view(), name = "blog_detail"), 
    url(r'^add/(?:\?id=(?P<blog_id>\d+))?$', permission_required("blog.add_blog")(BlogCreate.as_view()), name = "blog_add"), 
    url(r'^edit/(?:\?id=(?P<blog_id>\d+))?$', permission_required("blog.change_blog")(BlogUpdate.as_view()), name = "blog_edit"), 
    url(r'^delete/(?:\?id=(?P<blog_id>\d+))?$', permission_required("blog.delete_blog")(BlogDelete.as_view()), name = "blog_delete"), 
] 

models.py(ブログアプリ)

from django.db import models 
from datetime import datetime 
from taggit.managers import TaggableManager 
from django.contrib.auth.models import User 
from django.core.urlresolvers import reverse 
from django_comments.moderation import CommentModerator, moderator 
from django.shortcuts import redirect 

# Create your models here. 

class Blog(models.Model): 
    title = models.CharField(max_length = 100, unique_for_date = "posted", verbose_name = "Title") 
    description = models.TextField(verbose_name = "Description") 
    content = models.TextField(verbose_name = "Content") 
    posted = models.DateTimeField(default = datetime.now(), db_index = True, verbose_name = "Posted") 
    is_commentable = models.BooleanField(default = True, verbose_name = "Comments are allowed") 
    tags = TaggableManager(blank = True, verbose_name = "Tags") 
    user = models.ForeignKey(User, editable = False) 
    def get_absolute_url(self): 
     return reverse("blog_detail", kwargs = {"blog_id": self.pk}) 
    class Meta: 
     ordering = ["-posted"] 
     verbose_name = "blog article" 
     verbose_name_plural = "blog articles" 

views.py(ブログアプリ/ BlogCreate、BlogDetailView +などのみ)

... 

class PageNumberView(View): 
    def get(self, request, *args, **kwargs): 
     try: 
      self.sort = request.GET.get("sort") 
     except KeyError: 
      self.sort = "0" 
     try: 
      self.order = request.GET.get("order") 
     except KeyError: 
      self.order = "A" 
     try: 
      self.search = self.request.GET.get("search") 
     except KeyError: 
      self.search = "" 
     try: 
      self.tag = self.request.GET.get("tag") 
     except KeyError: 
      self.tag = "" 
     return super(PageNumberView, self).get(request, *args, **kwargs) 
    def post(self, request, *args, **kwargs): 
     try: 
      pn = self.request.GET.get("page", default=None) 
      if pn == None: 
       pn = "1" 
     except KeyError: 
      pn = "1" 
     self.success_url = self.success_url + "?page=" + pn 
     try: 
      self.success_url = self.success_url + "&search=" + self.request.GET.get("search") 
     except KeyError: 
      pass 
     try: 
      self.success_url = self.success_url + "&tag=" + self.request.GET.get("tag") 
     except KeyError: 
      pass 
     return super(PageNumberView, self).post(request, *args, **kwargs) 


class PageNumberMixin(CategoryListMixin): 
    def get_context_data(self, **kwargs): 
     context = super(PageNumberMixin, self).get_context_data(**kwargs) 
     try: 
      context["pn"] = self.request.GET.get("page", default=None) 
      if context["pn"] == None: 
       context["pn"] = "1" 
     except KeyError: 
      context["pn"] = "1" 
     return context 

class BlogDetailView(PageNumberView, DetailView, SearchMixin, PageNumberMixin): 
    model = Blog 
    template_name = "blog_detail.html" 
    def get_object(self): 
     return self.model.objects.get(pk=self.request.GET.get('id')) 

class CategoryListMixin(ContextMixin): 
    def get_context_data(self, **kwargs): 
     context = super(CategoryListMixin, self).get_context_data(**kwargs) 
     context["current_url"] = self.request.path 
     context["categories"] = Category.objects.all() 
     return context 

class BlogCreate(SuccessMessageMixin, CreateView, CategoryListMixin): 
    model = Blog 
    template_name = "blog_add.html" 
    success_message = "Article successfully created" 
    fields = '__all__' 
    def form_valid(self, form): 
     form.instance.user = self.request.user 
     return super(BlogCreate, self).form_valid(form) 

... 
+0

あなたの 'BlogDetailView'ビューの見た目を共有していません。 –

+2

なぜあなたはそのようなURLを書いていますか?これはDjangoでのURLの記述方法ではありません。すべての '?:\?id ='を取り除いてください。 –

+0

解決方法は、次のコードでget_absolute_url()メソッドをオーバーライドし、urlパターンのGET形式の説明を削除することです。 def get_absolute_url(self): return '{}? {} '。形式(逆( "blog_detail")、urlencode({'id':self.pk})) urlpatterns = [ url(詳細は$ '、BlogDetailView.as_view()、name = "blog_detail") 、 ] 解決策を提案http://vk.com/timofey.kukushkin – redwatcher

答えて

0

あなたのURLパターンの定義は

url(r'^detail/$', BlogDetailView.as_view(), name="blog_detail"), 

でなければなりません。このパラメータは、ビュー内でアクセス可能です。

blog_id = request.GET.get('blog_id') 
blog = get_object_or_404(Blog, id=blog_id) 

などです。

それとも、あなたのURLのblog_id一部を作りたい場合は、URLパターンは、あなたのURLが/blog/detail/123/のようになりますと、値はキーワード引数としてアクセスするために利用可能である場合には

url(r'^detail/(?P<blog_id>\d+)/$', BlogDetailView.as_view(), name="blog_detail"), 

でなければなりません。

1

あなたはちょうどこのようなURLを書く:あなたは/blog/detail/?blog_id=123のようにGETパラメータ(クエリパラメータ)を使用したい場合は

url(r'^detail/(?P<blog_id>\d+)/$', BlogDetailView.as_view(), name = "blog_detail"), 
関連する問題