Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python django教程:问题来自哪里?_Python_Django - Fatal编程技术网

Python django教程:问题来自哪里?

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

因此,我尝试学习django并遵循本教程:

在遵循教程并制作了民意测验应用程序之后,当我回顾并查看代码时,我不知道这个“问题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,)))
问题是我不知从哪里冒出来的

  • 是不是在创建模型时,django会自动为每个实例创建一个model_id

  • 另外,另一个问题是为什么他们要“pk=question_id”,然后使用pk。这有关系吗

  • URL.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'),
     ]
    
    从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'),
    ]
    
  • 此外,当使用类似这样的通用视图时:

    类详细视图(generic.DetailView): 模型=问题 模板名称='polls/detail.html'


  • 我们可以传递参数(如问题\ id)吗

    urlpatterns
    列表的
    urls.py
    中,您有以下路径:

    url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, name='vote')
    
    然后调用view函数,如下所示:

     vote(request=request, question_id=123)
    
  • 是不是在创建模型时,django会自动为每个实例创建一个model_id
  • 另外,另一个问题是为什么他们要“pk=question_id”,然后使用pk。这有关系吗
  • 这里pk代表“主键”。其实这没关系,不同的名字只是一个范围问题

    投票
    视图的函数参数名称为“question\u id”。
    get\u object\u或_404
    question.choice\u set.get
    方法中的函数参数名为“pk”

    它们只是指向同一对象的不同名称(例如整数
    123

  • 您的说法是正确的您可能希望在此处查看Django模型的相关文档:
  • 其中特别指出:

    默认情况下,Django为每个模型提供以下字段:

    id = models.AutoField(primary_key=True)
    
    这是一个自动递增的主键

    如果要指定自定义主键,只需指定
    primary\u key=True
    在您的一个字段上。如果Django看到你 显式设置
    字段。主键
    ,它不会添加自动
    id
    专栏

    每个模型只需要一个字段就可以有
    主键=True
    (或 显式声明或自动添加)

  • 您可能还想看看这个问题,它简要地解释了Django中ID和主键之间的区别:

  • 你为什么不试试看;)


  • 根据您的问题,问题_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会自动为创建的每个实例分配唯一的id

    question\u id不是模型的一部分,它是从url传递到视图中的参数。请注意最后一个url模式,其中您基本上通过模式定义参数的名称:
    url(r'^(?p[0-9]+)/vote/$”
    。您有
    def vote(self,question\u id)
    ,其中参数与URL模式中的定义匹配。