2016-02-06 3 views
-1

Я довольно новичок в Django, поэтому, естественно, я ударил стену. Я получаю это сообщение об ошибке при попытке создать страницу блога. Я попытался прочитать ошибку, которую я получаю, но безрезультатно.ТипError: post() отсутствует 1 требуемый позиционный аргумент: 'slug'

Полная ошибка:

TypeError at /blog/ 
post() missing 1 required positional argument: 'slug' 
Request Method: GET 
Request URL: http://127.0.0.1:8000/blog/ 
Django Version: 1.9.2 
Exception Type: TypeError 
Exception Value:  
post() missing 1 required positional argument: 'slug' 
Exception Location: /usr/lib/python3.4/site-packages/django/core/handlers/base.py in get_response, line 147 
Python Executable: /usr/bin/python3.4 
Python Version: 3.4.3 
Python Path:  
['/home/rumen/Desktop/venv2/blog_project', 
'/usr/lib/python3.4', 
'/usr/lib/python3.4/plat-x86_64-linux-gnu', 
'/usr/lib/python3.4/lib-dynload', 
'/usr/lib/python3.4/site-packages', 
'/usr/local/lib/python3.4/dist-packages', 
'/usr/lib/python3/dist-packages'] 

Ниже моя модель:

from django.db import models 
from django import forms 
from django.core.urlresolvers import reverse 

class Post(models.Model): 
    title = models.CharField(max_length=255) 
    slug = models.SlugField(unique=True, max_length=255) 
    description = models.CharField(max_length=255) 
    content = models.TextField() 
    published = models.BooleanField(default=True) 
    created = models.DateTimeField(auto_now_add=True) 

    class Meta: 
     ordering = ['-created'] 

    def __unicode__(self): 
     return u'%s' % self.title 

    def get_absolute_url(self): 
     return reverse('blog.views.post', args=[self.slug]) 

Посмотреть сообщение:

{% block title %}{{post.title}}{% endblock %} 

{% block content_blog %} 
<article> 
    <header> 
     <h1> {{post.title}} </h1> 
     <p> 
      Posted on 
      <time datetime="{{post.created|date:"c"}}"> 
      {{post.created|date}} 
      </time> 
     </p> 
    </header> 
    <p class="description"> 
     {{post.description}} 
    </p> 
    {{post.content|safe}} 
</article> 
{% endblock %} 

Url картина:

urlpatterns = [ 
    url(r'^blog/$', 'blog.views.post', name='blogpage'), 
    url(r'^(?P<slug>[\w\-]+)/$', 'blog.views.post'), 
] 

Вид:

from django.conf import settings 
from django.shortcuts import render, get_object_or_404 
from blog.models import Post 
from .forms import ContactForm 
from django.core.mail import send_mail 

def index(request): 
    posts = Post.objects.filter(published=True) 
    return render(request, 'blog/index.html', {'posts': posts}) 

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

def contact(request): 
    form = ContactForm(request.POST or None) 
    if form.is_valid(): 
     form_email = form.cleaned_data.get("email") 
     form_message = form.cleaned_data.get("message") 
     form_full_name = form.cleaned_data.get("full_name") 
     subject = 'Site contact form' 
     from_email = settings.EMAIL_HOST_USER 
     to_email = [from_email, '#'] 
     contact_message = "%s: %s via %s"%(
      form_full_name, 
      form_message, 
      form_email) 

     send_mail(subject, 
       contact_message, 
       from_email, 
       to_email, 
       fail_silently=False) 

    context = { 
     "form": form, 
    } 
    return render (request, 'forms.html', context) 

Не уверен, что еще мне нужно опубликовать, чтобы дать вам, ребята, больше деталей.

Я использую python 3.4.1 и django 1.9 на ubuntu 14.04.

+2

Итак, какая полная ошибка, и вы действительно попробовали предоставить параметр, который он вам скажет? – jonrsharpe

+1

По крайней мере, поскольку эта ошибка говорит вам, что это происходит в представлении 'post', вы должны опубликовать эту функцию и ее шаблон URL. –

+0

Теперь вы разместили шаблон и URL-адрес, но по-прежнему не размещали функции просмотра, как я просил, или полную ошибку, как это сделал Джон. –

ответ

0

Вы, кажется, передаете аргументы из браузера всем вашим атрибутам модели, кроме slug, который является позиционным аргументом функции post. Я не вижу, чтобы вы обрабатывали это при обработке запроса. Отсюда и отсутствующий позиционный аргумент. Вы делаете это в другом месте? Здесь вы просто скажете slug=slug. Откуда берутся второй slug? Вы должны использовать инструменты Django или JavaScript/Ajax/HTML-Post, чтобы получать их из браузера. Как только вы это сделаете, скажите через Ajax и JSON, это будет частью вашего запроса POST как dict().

def handle(request): 

    if request.method == 'POST' and (
       'module_status' in request.POST.keys() 
    ): 

     module_status = request.POST['module_status'] 
0

Вы получаете ошибку, потому что '^blog/$' настроен использовать определение post вида, для которого slug является обязательным полем, и ни один не подается в запросе HTTP через вход urlpatterns url(r'^blog/$', 'blog.views.post', name='blogpage'),.

Попробуйте установить значение по умолчанию для slug на ваш взгляд post определение и обработать два случая (для двух шаблонов url), соответственно.

def post(request, slug=None): 
    ...