Python django教程:问题来自哪里?
因此,我尝试学习django并遵循本教程: 在遵循教程并制作了民意测验应用程序之后,当我回顾并查看代码时,我不知道这个“问题id”是从哪里来的。它在创建模型时不显示 以下是型号代码:Python django教程:问题来自哪里?,python,django,Python,Django,因此,我尝试学习django并遵循本教程: 在遵循教程并制作了民意测验应用程序之后,当我回顾并查看代码时,我不知道这个“问题id”是从哪里来的。它在创建模型时不显示 以下是型号代码: from django.db import models from django.utils import timezone import datetime class Question(models.Model): question_text = models.CharField(max_length=2
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,)))
问题是我不知从哪里冒出来的
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'),
]
从django.exe导入渲染
从django.conf.url导入url
从…起导入视图
应用程序名称='polls'
URL模式=[
#例如:投票/
url(r'^$',views.IndexView.as_view(),name='index'),
#ex:/polls/5/
url(r'^(?P[0-9]+)/$',views.DetailView.as_view(),name='detail'),
#ex:/polls/5/结果/
url(r'^(?P[0-9]+)/results/$',views.ResultsView.as_view(),name='results'),
#ex:/polls/5/投票/
url(r'^(?P[0-9]+)/vote/$',views.vote,name='vote'),
]
我们可以传递参数(如问题\ id)吗 在
urlpatterns
列表的urls.py
中,您有以下路径:
url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, name='vote')
然后调用view函数,如下所示:
vote(request=request, question_id=123)
投票
视图的函数参数名称为“question\u id”。get\u object\u或_404
和question.choice\u set.get
方法中的函数参数名为“pk”
它们只是指向同一对象的不同名称(例如整数123
)
id = models.AutoField(primary_key=True)
这是一个自动递增的主键
如果要指定自定义主键,只需指定
primary\u key=True
在您的一个字段上。如果Django看到你
显式设置字段。主键
,它不会添加自动id
专栏
每个模型只需要一个字段就可以有主键=True
(或
显式声明或自动添加)
根据您的问题,问题_id是您创建的选项表的字段。如果您仔细查看代码,您可能会观察到question=models.Foreignkey,它指定选项表中的每个条目都和问题表中的每个问题相关
url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, name='vote'),
我将要求您运行以下命令
python manage.py SQL0001
当您观察输出时,它可能会为选择表指定直接对应于问题表id的问题id字段
url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, name='vote'),
url(r'^(?P[0-9]+)/vote/$,views.vote,name='vote'),
因此,当解析url like时
问题_id='34'部分来自(?P[0-9]+)。在模式周围使用括号“捕获”与该模式匹配的文本,并将其作为参数发送给我们在views.py中创建的view函数,?P定义用于标识匹配模式的名称,[0-9]+是一个正则表达式,用于匹配一系列数字(即数字)
此外,我们可以说,question_id是表中每个条目的标识符
1.在创建模型时,django是否会自动为每个实例创建一个模型id
是,django会自动为创建的每个实例分配唯一的idquestion\u id不是模型的一部分,它是从url传递到视图中的参数。请注意最后一个url模式,其中您基本上通过模式定义参数的名称:
url(r'^(?p[0-9]+)/vote/$”
。您有def vote(self,question\u id)
,其中参数与URL模式中的定义匹配。