在/ 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%}
答案 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'})