【发布时间】:2016-12-18 19:05:45
【问题描述】:
所以我正在尝试学习 django 并遵循本教程:https://docs.djangoproject.com/en/1.10/intro/tutorial01/
按照教程制作投票应用程序后,当我回头查看代码时,我只是看不出这个“question_id”来自哪里。创建模型时不会出现。
以下是模型代码:
from django.db import models
from django.utils import timezone
import datetime
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
def __str__(self):
return self.question_text
def was_published_recently(self):
return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text= models.CharField(max_length=200)
votes = models.IntegerField(default=0)
def __str__(self):
return self.choice_text
在 view.py 中:
from django.shortcuts import render, get_object_or_404
from django.http import HttpResponse, HttpResponseRedirect
from django.http import Http404
from django.template import loader
from django.urls import reverse
from django.views import generic
from .models import Question
from .models import Choice
from django.utils import timezone
def vote(request, question_id):
question = get_object_or_404(Question, pk=question_id)
try:
selected_choice = question.choice_set.get(pk=request.POST['choice'])
except (KeyError, Choice.DoesNotExist):
return render(request, 'polls/detail.html', {
'question': question,
'error_message': "You didn't select a choice.",
})
else:
selected_choice.votes += 1
selected_choice.save()
return HttpResponseRedirect(reverse('polls:results', args=(question.id,)))
question_id 不知从何而来。
是不是在创建模型的时候,django会自动为每个实例创建一个model_id?
另外,另一个问题是他们为什么要执行“pk=question_id”并在此后使用 pk。有关系吗?
urls.py 中的代码:
from django.shortcuts import render
from django.conf.urls import url
from . import views
app_name = 'polls'
urlpatterns = [
# ex: /polls/
url(r'^$', views.IndexView.as_view(), name='index'),
# ex: /polls/5/
url(r'^(?P<pk>[0-9]+)/$', views.DetailView.as_view(), name='detail'),
# ex: /polls/5/results/
url(r'^(?P<pk>[0-9]+)/results/$', views.ResultsView.as_view(), name='results'),
# ex: /polls/5/vote/
url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, name='vote'),
]
-
另外,当使用这样的通用视图时:
类 DetailView(generic.DetailView): 模型 = 问题 template_name = 'polls/detail.html'
我们可以传入参数(比如 question_id)吗?
【问题讨论】:
-
question_id 不是模型的一部分,它是从 url 传递到视图的参数。
-
请注意最后一个 URL 模式,您实际上是通过该模式定义参数的名称:
url(r'^(?P<question_id>[0-9]+)/vote/$'。你有def vote(self, question_id),其中的参数与 URL 模式中的定义相匹配。