2016-03-13 3 views
1

Я пытаюсь добавить пользовательские загружаемые изображения в своем веб-приложении с помощью подушки. Я создал модель загрузки Django и зарегистрировал ее в Admin. Как только я добавил фотографию с помощью консоли администратора, я получаю следующую ошибку. Изначально сайт работает все нормальноDjango NoReverseMatch at/

ошибка

NoReverseMatch at/

Reverse for 'thing_detail' with arguments '()' and keyword arguments '{u'slug': ''}' not found. 1 pattern(s) tried: ['things/(?P<slug>[-\\w]+)/$'] 

Request Method:  GET 
Request URL: http://localhost:8000/ 
Django Version:  1.8.4 
Exception Type:  NoReverseMatch 
Exception Value:  

Reverse for 'thing_detail' with arguments '()' and keyword arguments '{u'slug': ''}' not found. 1 pattern(s) tried: ['things/(?P<slug>[-\\w]+)/$'] 

Exception Location:  /usr/local/lib/python2.7/dist-packages/django/core/urlresolvers.py in _reverse_with_prefix, line 496 
Python Executable: /usr/bin/python 
Python Version:  2.7.6 
Python Path:  

['/home/shashank/development/hellowebapp/hellowebapp', 
'/usr/lib/python2.7', 
'/usr/lib/python2.7/plat-x86_64-linux-gnu', 
'/usr/lib/python2.7/lib-tk', 
'/usr/lib/python2.7/lib-old', 
'/usr/lib/python2.7/lib-dynload', 
'/usr/local/lib/python2.7/dist-packages', 
'/usr/lib/python2.7/dist-packages', 
'/usr/lib/python2.7/dist-packages/PILcompat', 
'/usr/lib/python2.7/dist-packages/gtk-2.0', 
'/usr/lib/pymodules/python2.7', 
'/usr/lib/python2.7/dist-packages/ubuntu-sso-client'] 

Server time: Sun, 13 Mar 2016 18:54:31 +0000 

urls.py

from collection.backends import MyRegistrationView 
from django.conf.urls import include, url 
from django.contrib import admin 
from collection import views 
from django.conf import settings 
from django.views.generic import TemplateView 
from django.contrib.auth.views import (
    password_reset, 
    password_reset_done, 
    password_reset_confirm, 
    password_reset_complete 
    ) 

urlpatterns = [ 
    url(r'^$', views.index, name='home'), 

    url(r'^about/$',TemplateView.as_view(template_name='about.html'),name='about'), 

    url(r'^contact/$',TemplateView.as_view(template_name='contact.html'),name='contact'), 

    url(r'^things/(?P<slug>[-\w]+)/$','collection.views.thing_detail',name='thing_detail'), 

    url(r'^things/(?P<slug>[-\w]+)/edit/$','collection.views.edit_thing',name='edit_thing'), 

    url(r'^things/(?P<slug>[-\w]+)/edit/weight$','collection.views.edit_weight',name='edit_weight'), 

    url(r'^things/(?P<slug>[-\w]+)/delete/weight$','collection.views.remove_weight',name='remove_weight'), 

    #WORKING url(r'^things/(?P<pk>\d+)/remove/$', 'collection.views.remove_weight', name='remove_weight'), 

    url(r'^things/$',TemplateView.as_view(template_name='weight_removed.html'),name='weight_removed'), 

    url(r'^(?P<slug>[\w\d-]+)/(?P<pk>\d+)/$','collection.views.remove_weight',name='remove_weight'), 






    #url(r'^edit/(?P<slug>\d+)/weights$', 'collection.views.AddWeight',name='AddWeight'), 
    # the new password reset URLs 
    url(r'^accounts/password/reset/$',password_reset,{'template_name':'registration/password_reset_form.html'},name="password_reset"), 
    url(r'^accounts/password/reset/done/$',password_reset_done,{'template_name':'registration/password_reset_done.html'},name="password_reset_done"), 
    url(r'^accounts/password/reset/(?P<uidb64>[0-9A-Za-z]+)-(?P<token>.+)/$',password_reset_confirm,{'template_name':'registration/password_reset_confirm.html'},name="password_reset_confirm"), 
    url(r'^accounts/password/done/$',password_reset_complete,{'template_name':'registration/password_reset_complete.html'},name="password_reset_complete"), 


    #setup additional registeration page 
    url(r'^accounts/register/$',MyRegistrationView.as_view(),name='registration_register'), 
    url(r'^accounts/create_thing/$','collection.views.create_thing',name='registration_create_thing'), 

    url(r'^accounts/',include('registration.backends.default.urls')), 
    url(r'^admin/', include(admin.site.urls)), 


] 

if settings.DEBUG: 
    urlpatterns += [ 
     url(r'^media/(?P<path>.*)$','django.views.static.serve',{'document_root': settings.MEDIA_ROOT,}), 
    ] 

Модели .py

from django.db import models 
from django.contrib.auth.models import User 
from django.db import models 
from django.utils import timezone 

class Thing(models.Model): 
    name = models.CharField(max_length=255) 
    description = models.TextField() 
    slug = models.SlugField(unique=True) 
    user = models.OneToOneField(User, blank=True, null=True) 


class Weight(models.Model): 
    date = models.DateTimeField(default=timezone.now) 
    weight_value = models.CharField(max_length=255) 
    thingRA = models.ForeignKey(Thing,related_name="weights") 

    class Meta: 
     order_with_respect_to = 'thingRA' 
     ordering = ['date'] 

def get_image_path(instance, filename): 
    return '/'.join(['thing_images', instance.thing.slug, filename]) 

class Upload(models.Model): 
    thing = models.ForeignKey(Thing, related_name="uploads") 
    image = models.ImageField(upload_to=get_image_path) 

admin.py

from django.contrib import admin 
# import your model 
from collection.models import Thing, Weight, Upload 


class ThingAdmin(admin.ModelAdmin): 
    model = Thing 
    list_display = ('name', 'description',) 
    prepopulated_fields = {'slug': ('name',)} 
    # and register it 

admin.site.register(Thing, ThingAdmin) 

class WeightAdmin(admin.ModelAdmin): 
    model = Weight 
    list_display = ('date','weight_value',) 

admin.site.register(Weight, WeightAdmin) 


class UploadAdmin(admin.ModelAdmin): 
    list_display = ('thing',) 
    list_display_links = ('thing',) 

# and register it 
admin.site.register(Upload, UploadAdmin) 

base.html

{% load staticfiles %} 

<!DOCTYPE html> 
<html> 
<head> 

    <title> 
    {% block title %} 
    WEB PAGE BY SHASHANK 
    {% endblock title %} 
    </title> 
    <link rel="stylesheet" href="{% static 'css/style.css' %}" /> 

</head> 
<body> 
     <div id="page"> 
     <div id="logo"> 
      <h1><a href="/" id="logoLink">S PORTAL</a></h1> 
     </div> 
     <div id="nav"> 
      <ul> 
       <li><a href="{% url 'home' %}">Home</a></li> 
       <li><a href="{% url 'about' %}">About</a></li> 
       <li><a href="{% url 'contact' %}">Contact</a></li> 

     {% if user.is_authenticated %} 
      <li><a href="{% url 'auth_logout' %}">Logout</a></li> 

      <li><a href="{% url 'thing_detail' slug=user.thing.slug %}">My Profile</a></li> 

     {% else %} 
      <li><a href="{% url 'auth_login' %}">Login</a></li> 

     <li><a href="{% url 'registration_register' %}">Register</a></li> 
     {% endif %} 
     </ul> 
     </div> 


     {% block content %}{% endblock content %} 


     <div id="footer"> 
      <p> 
     Webpage made by <a href="/" target="_blank">SHASHANK</a> 
      </p> 
     </div> 
    </div> 
</body> 
</html> 

View.py

from django.shortcuts import render,redirect,get_object_or_404 
from collection.models import Thing, Weight 
from collection.forms import ThingForm, WeightForm, ThingWeightFormSet 
from django.template.defaultfilters import slugify 
from django.contrib.auth.decorators import login_required 
from django.http import Http404 
from django.views.decorators.csrf import csrf_protect 
from django.views.generic import ListView, CreateView, UpdateView 
from django import forms 

def index(request): 
    things = Thing.objects.all() 
    return render(request,'index.html',{'things':things,}) 

def thing_detail(request, slug): 
    # grab the object... 
    thingRA = Thing.objects.get(slug=slug) 
    weights = thingRA.weights.all().order_by('-date') 
    # and pass to the template 
    return render(request, 'things/thing_detail.html', {'thing': thingRA, 'weights':weights,}) 

def edit_thing(request, slug): 
    # grab the object 
    thing = Thing.objects.get(slug=slug) 
    # set the form we're using 
    form_class = ThingForm 

    # if we're coming to this view from a submitted form 
    if request.method == 'POST': 
     # grab the data from the submitted form and apply to 
     # the form 
     form = form_class(data=request.POST, instance=thing) 
     if form.is_valid(): 
      # save the new data 
      form.save() 
      return redirect('thing_detail', slug=thing.slug) 
# otherwise just create the form 
    else: 
     form = form_class(instance=thing) 

# and render the template 
    return render(request, 'things/edit_thing.html', {'thing': thing,'form': form,}) 

def create_thing(request): 
    form_class = ThingForm 
    if request.method == 'POST': 
     form = form_class(request.POST) 
     if form.is_valid(): 
      thing = form.save(commit=False) 
      thing.user = request.user 
      thing.slug = slugify(thing.name) 
      thing.save() 
      slug = slugify(thing.name) 
      return redirect('thing_detail', slug=thing.slug) 
    else: 
     form = form_class() 

    return render(request,'things/create_thing.html', {'form': form,}) 


def edit_weight(request, slug): 
    thing = get_object_or_404(Thing, slug=slug) 
    if request.method == "POST": 
     form = WeightForm(request.POST) 
     if form.is_valid(): 
      weight = form.save(commit=False) 
      weight.thingRA = thing 
      weight.save() 
      return redirect('thing_detail', slug=thing.slug) 
    else: 
     form = WeightForm() 
    return render(request, 'things/edit_weight.html', {'form': form}) 

"""WORKING WEIGHT 
def remove_weight(request, pk): 
      weight = get_object_or_404(Weight, pk=pk) 
      thing_pk = weight.thingRA.pk 
      weight.delete() 
      return redirect('weight_removed') 
""" 


def remove_weight(request, pk, slug): 
      weight = get_object_or_404(Weight, pk=pk) 
      thing = get_object_or_404(Thing, slug=slug) 
      thing_pk = weight.thingRA.pk 
      weight.delete() 
      return redirect('thing_detail', slug=slug) 


@login_required 
def edit_thing(request, slug): 
    # grab the object... 
    thing = Thing.objects.get(slug=slug) 
    # make sure the logged in user is the owner of the thing 
    if thing.user != request.user: 
     raise Http404 
     # set the form we're using... 
    form_class = ThingForm 
    # if we're coming to this view from a submitted form, 
    if request.method == 'POST': 
     # grab the data from the submitted form and 
     # apply to the form 
     form = form_class(data=request.POST, instance=thing) 
     if form.is_valid(): 
      # save the new data 
      form.save() 
      return redirect('thing_detail', slug=thing.slug) 
    # otherwise just create the form 
    else: 
     form = form_class(instance=thing) 
     # and render the template 
    return render(request, 'things/edit_thing.html', {'thing': thing,'form': form,}) 

ответ

0

Наконец-то выяснилось. Проблема не была в коде. На самом деле все, что мне было нужно, это выйти из панели администратора в Django. Поскольку вход в панель администратора запретил другим пользователям взаимодействовать со связанными с ними данными.

1

Вы, вероятно, используя {% url 'thing_detail' slug=thing.slug %} в шаблоне с 'thing' объекта, который имеет пустой атрибут слизняка.

Либо добавьте условное выражение в свой шаблон, который проверяет существующий слизень в объекте, чтобы тег шаблона не был вызван, или убедитесь, что ни один из ваших объектов Thing не имеет пустого пула.

+0

В соответствии с инструкциями Антуана я проверил пустой пул с помощью оболочки. Я не нашел их. Веб-сайт работал отлично даже после использования {% url 'thing_detail' slug = thing.slug%} в моем шаблоне. –

2

Я бы сказал, что у вас есть Вещь с slug="". Вы можете проверить это с помощью Джанго оболочки:

from yourapp.models import Thing 
Thing.objects.get(slug='') 

Согласно вашему определению модели slug может быть пустым, но ваш шаблон URL не принимает пустой слизняка. Вам нужно будет исправить либо ваше поле пули, либо ваш шаблон url.

+0

Пробовал, как вы сказали. Я не нашел запись без пули или пустого поля. Кроме того, если это так, то как работает сайт, прежде чем я внес изменения для добавления изображений. Пожалуйста, помогите мне. –

+0

Я думал, что ошибка была от администратора, потому что вы показали нам admin.py, но похоже, что это от вашего корневого URL. Пожалуйста, покажите свой домашний вид и шаблон. –

+0

выделенная ошибка отображается в «{% url 'thing_detail' slug = user.thing.slug%}" в моем base.html. Я добавил это как решение другой проблемы, и все это было хорошо. Единственные изменения, которые я внес, заключались в добавлении модели Uploads и последних нескольких строк в Urls.py и Admin.py –