Django을 사용하여 간단한 은행 업무 응용 프로그램을 작성하려고하는데 이상한 오류가 발생하여 위치 인수가 누락되었습니다. 어떤 도움이라도 대단히 감사 할 것입니다. 다른 템플릿과 뷰는 정상적으로 작동합니다. 로그인 페이지로 갈 때 문제가 발생합니다.Django TypeError missing 1 필수 위치 인수 : 'person_id'
전체 오류는 다음과 같습니다
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
스택 추적 :
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
의 URL 파일 :
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'),
]
모델 파일은 다음과 같습니다
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
견해 파일은 다음과 같습니다
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))
로그인 템플릿은 다음과 같습니다
는{% 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>
내장 된 인증 시스템을 사용하십시오. 보안을 위해 인증되지 않은 인증 시스템을 사용하면 사이트를 위험에 빠뜨릴뿐만 아니라 개인 정보를 노출하거나 위험에 처한 다른 사이트에 사용자의 계정을 넣을 수도 있습니다. 암호를 일반 텍스트로 저장하는 것은 안전하지 않습니다. – knbk
로그인보기에서 어떤 이유로 인해 person_id가 필요하지만 URL에서 그 값을 캡처하지 않습니다. 이것의 어느 것도 전혀 의미가 없다는 것에주의하십시오. 당신은 Choice 모델을 가지고 있지 않으며 Person 자체가 아닌 사용자 이름과 패스워드를 왜 체크 할 것인지는 명확하지 않다. 어쨌든, knbk이 말했듯이, ** 자신의 인증을 수행해서는 안됩니다 **. –