2011-04-19 51 views
0

我有一個註冊表單,需要爲我的網站的每個頁面加載,如果用戶是來賓。我認爲最簡單的方法是創建一個「註冊」應用程序/模塊,並在init .py中定義窗體變量,以便在每個視圖中自動啓動它,假設我導入了該模塊。不過,我在查看錶單變量時遇到了一些麻煩。 「全球名稱」表單未定義「以下是我的設置:Django模塊,應用程序和導入問題 - 對象沒有屬性「窗體」

我有一個/ signup/init .py和/signup/form.py文件。

這是我初始化的.py

from django import forms 
from signup.form import SignUpForm 

form = SignupForm() 

這是我form.py

class SignupForm(forms.Form): 
    fullname = forms.CharField(min_length=3, max_length=25, initial='name', error_messages={'required': 'A unique username is required.', 'min_length': 'Your username must contain at least 3 characters.'}) 
    username = forms.CharField(min_length=3, max_length=25, initial='choose a username', error_messages={'required': 'A unique username is required.', 'min_length': 'Your username must contain at least 3 characters.'}) 
    password = forms.CharField(min_length=7, initial='choose a password', error_messages={'required': 'Please enter a password.','min_length': 'Your password must contain at least 7 characters.'}) 
    email = forms.EmailField(initial='e-mail address', error_messages={'required': 'Please enter a valid email address.', 'invalid': 'Please enter a valid email address.'}) 
    find_me = forms.BooleanField(initial=True, required=False) 
    tos = forms.BooleanField(error_messages={'required': 'You must accept our Terms of Service.'}) 

而且我試圖加載那些從我/views/index.py文件:

from django.http import HttpResponse 
from pymongo import * 
from user import * 
import mongo 
from django.shortcuts import render_to_response 
from django.template import RequestContext, loader 
import signup 

#index view 
def index(request): 

    return render_to_response('index.html', 
     {'form': signup.form}, 
     context_instance=RequestContext(request), 
    ) 

我刪除了index.py中不相關的代碼......但基本上......(我可能會h如果返回聲明只返回「表單」:表單,當用戶未註冊時)

我接近完全錯誤嗎?任何人都在向我展示我做錯了什麼?

::編輯::

另外,我注意到,我沒有signup.form的回報,但仍然拋出一個

AttributeError at/
'module' object has no attribute 'form' 

錯誤。我改變了上面的代碼以適應

回答

2

我只想指出,你這樣做的方式是一個非常糟糕的主意。您在每個請求中都有一個表單實例:這總是很危險,可以在請求中泄漏信息。不要這樣做。

取而代之,請使用Django必須爲您執行此操作的內置機制:context processors。在您的註冊/ form.py,定義了一個簡單的函數:

def signup_form(request): 
    return SignupForm() 

這settings.py中添加TEMPLATE_CONTEXT_PROCESSORS

'signup.form.signup_form', 
+0

非常感謝。我是一個Django/Python newb ..我完全不知道你可以這樣做。 :) – Chris 2011-04-21 02:42:25

1

您應該使用from signup import formfrom signup import *使您的views.py中的form變量可用。如果你做import signup它會導入模塊的名字空間signup,並解決你需要做的形式signup.form

+0

是的,我僅僅指剛意識到,我張貼了這個後..我試過signup.form,它給我AttributeError在/ '模塊'對象沒有'form'屬性 – Chris 2011-04-19 01:14:27

+1

另一個問題可能是你的form有一個重疊的名字。因爲首先你看到在註冊('signup.form')裏面有一個form.py。之後,您可以通過__init__.py中的form = SignupForm()來「覆蓋」這個表單變量。所以你用不同的東西使用相同的名稱。這很可能就是第二次追溯的原因。它根本無法正確解析'form'。 – 2011-04-19 01:23:41

+0

嘗試重命名一個'form'變量('_ sign_form__模塊或'__init__.py中的'form'引用)。然後看看你是否仍然有這個問題。 – 2011-04-19 01:25:30

1

我不知道你試圖通過將它分配給一個標識符來做什麼?

我這樣做:

#init.py: 
from django import forms 
from signup.form import SignUpForm 

#index view 
def index(request): 

    return render_to_response('index.html', 
     {'form': signup.SignUpForm()}, 
     context_instance=RequestContext(request), 
    ) 

OR

#init.py: 
from django import forms 
from signup.form import SignUpForm as Form 

#index view 
def index(request): 

    return render_to_response('index.html', 
     {'form': signup.Form()}, 
     context_instance=RequestContext(request), 
    ) 

UPDATE

您form.py更改爲:

class SignUpForm(forms.Form): 

而不是:

class SignupForm(forms.Form): 
+0

一些粗略的事情正在繼續...我在嘗試在註冊中導入任何內容時,得到「無模塊命名錶單」。我甚至嘗試在settings.py中爲installed_apps添加註冊,結果相同。 – Chris 2011-04-19 01:42:39

+0

您需要在安裝的應用程序中使用它。我的猜測是你有**表格** .py,你正試圖導入註冊。 **形成**。另外我注意到你的類是** SignupForm **,並且你正在嘗試導入** SignUpForm ** – 2011-04-19 02:18:13

+0

我更早更正了大小寫問題..它確實叫做form.py而不是forms.py – Chris 2011-04-19 03:43:51

相關問題