我收到一个错误消息,说投票后重定向时类别匹配查询不存在

时间:2019-03-12 06:34:17

标签: python django

在/ rank / annapurna-circuit-trek /
处不存在 类别匹配查询不存在。
请求方法:GET
要求网址:http://127.0.0.1:8000/rank/annapurna-circuit-trek/
Django版本:2.1.5
异常类型:DoesNotExist
异常值:类别匹配查询不存在。
异常位置:C:\ Users \ Lenovo \ AppData \ Local \ Programs \ Python
选项中的C:\ Users \ Lenovo \ Desktop \ Django_Projects \ TheRanker \ rank \ views.py
    category = Category.objects.get(slug = slug)

  

models.py

    class Category(models.Model):
    name = models.CharField(max_length=250)
    slug = AutoSlugField(populate_from='name')
    details = models.TextField(blank=True)
    image = models.ImageField(blank=True,upload_to='categories')
    views = models.IntegerField(default=0)
    created = models.DateTimeField(auto_now=True)
    modified = models.DateTimeField(auto_now_add=True)
    active = models.BooleanField(default=True)

    def __str__(self):
        return self.name

    class Meta:
        verbose_name_plural = "Categories"


class Option(models.Model):
    name = models.CharField(max_length=250)
    slug = AutoSlugField(populate_from='name')
    image = models.ImageField(blank=True,upload_to='options')
    details = models.TextField()
    category = models.ForeignKey(Category, on_delete=CASCADE)
    votes = models.IntegerField(default=0)
    active = models.BooleanField(default=True)

    def __str__(self):
        return self.name


class Vote(models.Model):
    option = models.ForeignKey(Option, on_delete=CASCADE)
    voter = models.ForeignKey(User, on_delete=CASCADE)
    slug = AutoSlugField(populate_from='option')

    def __str__(self):
        return self.voter
  

urls.py

 from django.urls import path

from rank import views
app_name = 'rank'
urlpatterns = [
   path('',views.home,name='home'),
   path('register/',views.registration,name='register'),
   path('login/',views.my_login,name='login'),
   path('logout/',views.my_logout,name='logout'),
   path('<slug>/',views.options,name='options'),
   path('<slug>/vote/', views.vote, name='vote'),

]
  

views.py

     def home(request):
        categories = Category.objects.filter(active=True)
        return render(request,'rank/base.html',{'categories': categories,'title':'TheRanker'})

    def options(request,slug):
        category = Category.objects.get(slug=slug)
        options = Option.objects.filter(category=category)
        return render(request,'rank/options.html',{'options':options,'title':'options'})

    def vote(request,slug):
        option = Option.objects.get(slug=slug)
        if Vote.objects.filter(slug=slug,voter_id=request.user.id).exists():
            messages.error(request,'You Already Voted!')
            return redirect('rank:options',slug)
        else:
            option.votes += 1
            option.save()
            voter = Vote(voter=request.user,option=option)
            voter.save()
            messages.success(request,'Voted!')
            return redirect('rank:options',slug)


    def registration(request):
        if request.method == "POST":
            form = RegisterForm(request.POST)
            if form.is_valid():
                user = form.save(commit=False)
                user.save()
                messages.success(request,'Account Created. Login now')
                return redirect('rank:login')
        else:
            form = RegisterForm()
        return render(request,'rank/register.html

',{'form':form})
  

admins.py

 from django.contrib import admin

# Register your models here.
from rank.models import Option, Category


class OptionInline(admin.TabularInline):
    model = Option


class CategoryAdmin(admin.ModelAdmin):
    list_display = ['name', 'created', 'modified', 'views', 'active', 'details']
    search_fields = ['name', 'details']
    list_filter = ['created', 'views', 'created', 'modified']
    inlines = [OptionInline]


admin.site.register(Category, CategoryAdmin)
  

forms.py

c

lass LoginForm(forms.Form):
    username = forms.CharField(max_length=250)
    password = forms.CharField(widget=PasswordInput)

class RegisterForm(UserCreationForm):
    def clean_email(self):
        email = self.cleaned_data['email']
        if User.objects.filter(email=email).exists():
            raise ValidationError('Email Already Exists')
        return email
    class Meta:
        model = User
        fields = ["username", "email", "password1", "password2"]
  

options.html

{% extends "rank/base.html" %}
 <title>{% block title %}{{title}}{% endblock title%}</title>
{% load bootstrap4 %}
{% block content %}
<center><br>
     <center>{% bootstrap_messages %}</center>
     <ol type="1">
    {% for option in options %}

     <div class="col-lg-6 col-md-6 mb-6">
              <div class="card h-100">
                <div class="card-body">
                    <b><li>
                  <img src="/media/{{option.image}}" width="200" height="100">
                 <h4>{{option.name}}
                  </h4>
                  <h5 class="card-text">{{ option.details}}</h5>
                      <h5>{{ option.votes }} votes</h5>
                       <form action="{% url 'rank:vote' option.slug %}" method="post">
                           {% csrf_token %}
                <input type="submit" class="btn btn-success" value="Vote" >
                       </form>
                 </li></b>
                </div>
                <div class="card-footer">
                  <small class="text-muted"></small>
                </div>
              </div>
                </div>

    {% endfor %}
     </ol>
</center>



{% endblock content%}

2 个答案:

答案 0 :(得分:0)

我相信您有此错误,因为:

category = Category.objects.get(slug=slug)

也许您没有这个类别的类别。 您应该使用:

 from django.shortcuts import get_object_or_404

 def home(request):
        categories = Category.objects.filter(active=True)
        return render(request,'rank/base.html',{'categories': categories,'title':'TheRanker'})

    def options(request,slug):
        category = get_object_or_404(Category, slug=slug)
        options = Option.objects.filter(category=category)
        return render(request,'rank/options.html',{'options':options,'title':'options'})

或:

try:
        category = Category.objects.get(slug=slug)
except:
        category = None

option = Option.objects.get(slug=slug)使用相同的内容

答案 1 :(得分:0)

这里您正试图从Category子弹中获取Option

def vote(request,slug):
    # this slug belongs to a option like mentioned in following line
    option = Option.objects.get(slug=slug)
    if Vote.objects.filter(slug=slug,voter_id=request.user.id).exists():
        messages.error(request,'You Already Voted!')
        return redirect('rank:options',slug)
    else:
        option.votes += 1
        option.save()
        voter = Vote(voter=request.user,option=option)
        voter.save()
        messages.success(request,'Voted!')
        return redirect('rank:options',slug)  # <-- Here you are using option slug to fetch category 

我假设您想从子弹中获取类别和相关选项。因此,代码如下所示:(使用reverse relation从类别中获取选项)

 def options(request,slug):
        options = Option.objects.get(slug=slug)
        category = options.category
        return render(request,'rank/options.html',{'options':category.options_set.all(),'title':'options'})

或者,您可能只需要给定子弹的选项:

 def options(request,slug):
        return render(request,'rank/options.html',{'options':Option.objects.filter(slug=slug),'title':'options'})