2017-06-13 67 views
0

爲什麼在嘗試運行我的服務器以訪問數據庫以查看我的代碼是否工作時出現錯誤?在Terminal的項目文件夾中,我運行sudo python manage.py runserver嘗試運行服務器,但由於上述錯誤而無法運行。我環顧四周,但找不到與我的問題直接相關的問題。爲什麼我會發生遞歸錯誤?

我收到我的if()聲明是問題所在。

我得到的錯誤說:

RuntimeError: maximum recursion depth exceeded while calling a Python object 

這是我的views.py文件:

from .models import Album 
from django.shortcuts import render, redirect 
from django.contrib.auth import authenticate, login 
from django.core.urlresolvers import reverse_lazy 
from django.views import generic 
from django.views.generic import View 
from django.views.generic.edit import CreateView, UpdateView, DeleteView 
from .forms import UserForm 

class IndexView(generic.ListView): 
    template_name = 'music/index.html' 
    context_object_name = 'all_albums' 

    def get_queryset(self): 
     return Album.objects.all() 

class DetailView(generic.DeleteView): 
    model = Album 
    template_name = 'music/detail.html' 

class AlbumCreate(CreateView): 
    model = Album 
    fields = ['artist', 'album_title', 'genre', 'album_logo'] 

class AlbumUpdate(UpdateView): 
    model = Album 
    fields = ['artist', 'album_title', 'genre', 'album_logo'] 

class AlbumDelete(DeleteView): 
    model = Album 
    success_url = reverse_lazy('music:index') 

class UserFormView(View): 
    form_class = UserForm 
    template_name = 'music/registration_form' 

    # display blank form 
    def get(self, request): 
     form = self.form_class(None) 
     return render(request, self.template_name, {'form': form}) 

    def post(self): 
     form = self.form_class(request.POST) 

     if form.is_valid(): 
      user = form.save(commit=False) 

      #cleaned normalized data 

      username = form.cleaned_data['username'] 
      password = form.cleaned_data['password'] 

      user.set_password(password) 
      user.save() 

錯誤的尾巴:

File "/Library/Python/2.7/site-packages/Django-1.11.2-py2.7.egg/django/urls/resolvers.py", line 255, in check 
    warnings.extend(check_resolver(pattern)) 
    File "/Library/Python/2.7/site-packages/Django-1.11.2-py2.7.egg/django/core/checks/urls.py", line 26, in check_resolver 
    return check_method() 
    File "/Library/Python/2.7/site-packages/Django-1.11.2-py2.7.egg/django/urls/resolvers.py", line 172, in check 
    warnings = self._check_pattern_startswith_slash() 
    File "/Library/Python/2.7/site-packages/Django-1.11.2-py2.7.egg/django/urls/resolvers.py", line 140, in _check_pattern_startswith_slash 
    regex_pattern = self.regex.pattern 

這是我的forms.py文件:

from django.contrib.auth.models import User 
from django import forms 

class UserForm(forms.ModelForm): # UserForm inherits from forms. 
    passwords = forms.CharField(widget=forms.PasswordInput) 

    class Meta: # Information about your class. 
     model = User # whenevr a creates sign up to your site it's gonna go in same table 
     fields = ['username', 'email', 'password'] 

這是我的urls.py文件:

from django.conf.urls import include, url 
from django.contrib import admin 
from django.conf import settings 
from django.conf.urls.static import static 

app_name = 'music' 

urlpatterns = [ 
    url(r'^admin/', admin.site.urls), 
    url(r'^music/', include('music.urls')) 
] 

if settings.DEBUG: 
    urlpatterns += static(settings.STATIC_URL, document_root = settings.STATIC_ROOT) 
    urlpatterns += static(settings.STATIC_URL, document_root=settings.MEDIA_ROOT) 
+5

我知道一個遞歸回溯可以很長,但我們可以有它的尾巴嗎?從結尾向上的所有行不重複。 –

+0

也許你重寫UserForm保存方法?你可以把代碼放在這裏嗎? –

+0

@MartijnPieters發佈了 – bojack

回答

0

您沒有通過request到您的post方法,它應該是,

class UserFormView(View): 
    form_class = UserForm 
    template_name = 'music/registration_form.html' 


    def post(self, request, *args, **kwargs): 
     # blaah 

而且,錯過了你的模板的擴展。

0

我認爲你應該爲此使用FormView,並且不需要在視圖中重寫post或get方法,因爲如果用戶在View中分配了form_class,你將獲得模板中的表單對象。您必須重寫form_valid()方法爲您的自定義操作

class UserFormView(FormView): 
    form_class = UserForm 
    template_name = 'music/registration_form' 

    def form_valid(self, form) 
     user = form.save(commit=False) 
     username = form.cleaned_data['username'] 
     password = form.cleaned_data['password'] 
     user.set_password(password) 
     user.save()