2016-08-13 2 views
-2

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> 
+2

내장 된 인증 시스템을 사용하십시오. 보안을 위해 인증되지 않은 인증 시스템을 사용하면 사이트를 위험에 빠뜨릴뿐만 아니라 개인 정보를 노출하거나 위험에 처한 다른 사이트에 사용자의 계정을 넣을 수도 있습니다. 암호를 일반 텍스트로 저장하는 것은 안전하지 않습니다. – knbk

+0

로그인보기에서 어떤 이유로 인해 person_id가 필요하지만 URL에서 그 값을 캡처하지 않습니다. 이것의 어느 것도 전혀 의미가 없다는 것에주의하십시오. 당신은 Choice 모델을 가지고 있지 않으며 Person 자체가 아닌 사용자 이름과 패스워드를 왜 체크 할 것인지는 명확하지 않다. 어쨌든, knbk이 말했듯이, ** 자신의 인증을 수행해서는 안됩니다 **. –

답변

1

문제는 여기에 있습니다 :

def login(request, person_id): 
    person = get_object_or_404(Person, pk=person_id) 

로보기는 person_id가 URL에서 전달하지만 될 것으로 예상 URL 패턴은 person_id을 포함하지 않습니다.

휠을 재발 명하지 마십시오. 내장 된 인증 시스템을 사용하십시오. 그리고해야하는 경우 usernamepasswordrequest.POST에서 검색하고 사용자 이름을 사용하여 올바른 사용자 (사람)를 찾아야합니다. 어쨌든 person_id를 사용하는 것이 최선의 해결책은 아닐 것입니다.

+0

답장을 보내 주셔서 감사합니다. 인증 시스템이 내장되어 있는지 몰랐습니다. 그것에 관한 문서를 읽도록하겠습니다. – greatchicken

+0

selected_login = request.POST.get ('login') 및 selected_username = request.POST.get ('username')을 추가하고 person_id를 제거하고 URL을 업데이트하면 작동합니다. 장고 문서를 읽을 시간! – greatchicken

+0

답변으로 문제가 해결되면 답을 수락하는 것이 좋습니다. – masnun

관련 문제