Django TypeError 缺少 1 个必需的位置参数:“person_id”

gre*_*ken 2 django

我正在尝试使用Django编写一个简单的银行应用程序,但遇到了一个奇怪的错误,缺少位置参数。任何帮助将非常感激。其他模板和视图工作正常。当我进入登录页面时出现问题。

完整的错误是:

TypeError at /banking/login/

login() missing 1 required positional argument: 'person_id'

Request Method:     GET
Request URL:    http://127.0.0.1:8000/banking/login/
Django Version:     1.9
Exception Type:     TypeError
Exception Value:    

login() missing 1 required positional argument: 'person_id'

Exception Location:     /home/soupdragon/DJapps/env/lib/python3.4/site-
packages/django/core/handlers/base.py in get_response, line 147
Python Executable:  /home/soupdragon/DJapps/env/bin/python
Python Version:     3.4.3
Python Path:    

'/home/soupdragon/DJapps/banking/mybank',
'/home/soupdragon/DJapps/env/lib/python3.4',
'/home/soupdragon/DJapps/env/lib/python3.4/plat-i386-linux-gnu',
'/home/soupdragon/DJapps/env/lib/python3.4/lib-dynload',
'/usr/lib/python3.4',
'/usr/lib/python3.4/plat-i386-linux-gnu',
'/home/soupdragon/DJapps/env/lib/python3.4/site-packages']

Server time:    Fri, 12 Aug 2016 17:39:38 +0000
Run Code Online (Sandbox Code Playgroud)

堆栈跟踪是:

Internal Server Error: /banking/login/
Traceback (most recent call last): 
File "/home/soupdragon/DJapps/env/lib/python3.4/site-packages/django
/core/handlers/base.py", line 149, in get_response
response = self.process_exception_by_middleware(e, request)
File "/home/soupdragon/DJapps/env/lib/python3.4/site-packages/django 
/core/handlers/base.py", line 147, in get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
TypeError: login() missing 1 required positional argument: 'person_id'
[12/Aug/2016 17:39:38] "GET /banking/login/ HTTP/1.1" 500 6010
Run Code Online (Sandbox Code Playgroud)

网址文件:

from django.conf.urls import url

from . import views

app_name = 'banking'
urlpatterns = [
# ex: /banking/deposit
url(r'^deposit/$', views.deposit, name='deposit'),
# ex: /banking/
url(r'^$', views.hello, name='hello'),
# ex: /banking/login
url(r'^login/$', views.login, name='login'),
# ex: /banking/transfer
url(r'^transfer/$', views.transfer, name='transfer'),
# ex: /banking/withdraw
url(r'^withdraw/$', views.withdraw, name='withdraw'),
# ex: /banking/welcome
url(r'^welcome/$', views.welcome, name='welcome'),
]
Run Code Online (Sandbox Code Playgroud)

模型文件是:

from django.db import models

# Create your models here.
class Person(models.Model):
     first_name = models.CharField(max_length=4,default="Bob")
     last_name = models.CharField(max_length=6,default="Smith")
     login_name = models.CharField(max_length=3,default="me")
     password = models.CharField(max_length=7, default="password")
     person_text = models.CharField(max_length=10, default="Bob Smith") 

     def get_first_name(self):
         return self.first_name

     def get_last_name(self):
         return self.last_name

     def get_login_name(self):
         return self.login_name

     def get_password(self):
         return self.password

     def __str__(self):
         return self.person_text

class Account1(models.Model):
    account_number = models.IntegerField(default=12345678)
    bank_balance = models.DecimalField(max_digits=4,
    decimal_places=2,default=12.99)
    interest_rate = models.IntegerField(default=2)
    account_name = models.CharField(max_length=16, default="Current
                    Account")
    person = models.ForeignKey(Person,                     on_delete=models.CASCADE,default="") 

    def get_account_number(self):
        return self.account_number

    def get_bank_balance(self):
        return self.bank_balance

    def deposit(self, amount):
        self.bank_balance = self.bank_balance + amount
        return

    def get_interest_rate(self):
        return self.interest_rate

    def withdraw(self, amount):
        self.bank_balance = self.bank_balance - amount
        return

    #def __str__(self):
    #   return self.account_name
Run Code Online (Sandbox Code Playgroud)

视图文件是:

from django.shortcuts import get_object_or_404, render
from django.http import HttpResponseRedirect, HttpResponse
from django.core.urlresolvers import reverse
from django.template import loader

from .models import Person, Account1

# Create your views here.
def deposit(request):
    person = Person
    account1 = Account1
    context = {'account1':account1,'person':person}
    template = loader.get_template('banking/deposit.html')
    return HttpResponse(template.render(context,request))

def hello(request):
    return HttpResponse("Hello.")

def login(request, person_id):
    person = get_object_or_404(Person, pk=person_id) 
    try:
        selected_login = person.choice_set.get(pk=request.POST['login'])
        selected_password = person.choice_set.get(pk=request.POST['password'])
    except (KeyError, Choice.DoesNotExist):
        # Redisplay the question voting form.
        return render(request, 'banking/login.html', {
            'person': person,
            'error_message': "You didn't select a choice.",
        })
    else:
        # Always return an HttpResponseRedirect after successfully dealing
        # with POST data. This prevents data from being posted twice if a
        # user hits the Back button.
        return HttpResponseRedirect(reverse('banking:welcome',
            args=(question.id,)))


def transfer(request):
    person = Person
    account1 = Account1
    context = {'account1':account1,'person':person}
    template = loader.get_template('banking/transfer.html')
    return HttpResponse(template.render(context,request))

def welcome(request):
    person = Person
    account1 = Account1
    context = {'account1':account1,'person':person}
    template = loader.get_template('banking/welcome.html')
    return HttpResponse(template.render(context,request))

def withdraw(request):
    person = Person
    account1 = Account1
    context = {'account1':account1,'person':person}
    template = loader.get_template('banking/withdraw.html')
    return HttpResponse(template.render(context,request))
Run Code Online (Sandbox Code Playgroud)

登录模板为:

{% load staticfiles %}
 <!DOCTYPE html>
 <html>
 <head>
 <title>Deposit Money</title>
 <h1 id="bluetext">Please Select Account to Deposit into</h1>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1">
 <link rel="stylesheet" href="{% static 'css/deposit.css' %}">
 <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap
 /3.3.5/css/bootstrap.min.css">
 <script src="https://ajax.googleapis.com/ajax/libs/jquery
 /1.11/jquery.min.js"></script>  
 <style type="text/css"></style>
 </head> 
 <body>

 <div class="container-fluid" style="background-image:
 url('login.jpg'); width: 100%; height: 300px; background-size:cover;"> 
 </div>

<form action="{% url 'banking:login' person.id %}" method="post">
<fieldset>
{% csrf_token %}
<legend>Your details:</legend>
<hr></hr>
Username:<input type="text" id="username" name="username" size="33
</input>
<br></br>
Password:<input type="text" id="password" name="password" size="33">
</input>
<input type="submit" name="submit" value="Submit"></input>
</fieldset>
</form>

</body>
</html>
Run Code Online (Sandbox Code Playgroud)

mas*_*nun 9

问题就在这里:

def login(request, person_id):
    person = get_object_or_404(Person, pk=person_id) 
Run Code Online (Sandbox Code Playgroud)

您的视图期望person_id从 url 传递,但您的 url 模式不包含person_id.

请不要重新发明轮子 - 使用内置的身份验证系统。如果必须,您应该尝试检索并username使用用户名来查找正确的用户(人)。无论如何,使用 person_id 可能不是最好的解决方案。passwordrequest.POST