Модуль Django, приложение и вопрос об импорте - объект не имеет атрибута «форма» - PullRequest
0 голосов
/ 19 апреля 2011

У меня есть форма регистрации, которую необходимо загрузить для каждой страницы моего сайта, если пользователь является гостем. Я подумал, что самый простой способ сделать это - создать приложение / модуль "регистрация" и определить переменную формы в init .py, чтобы он автоматически запускался при каждом просмотре, при условии, что я импортировал модуль , Тем не менее, у меня возникли некоторые проблемы, связанные с поиском переменной формы. "глобальное имя" форма "не определено" Ниже приведены мои настройки:

У меня есть файлы /signup/init.py и /signup/form.py.

Это мой init .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 ... но в основном .. (у меня, вероятно, будет if if для оператора return, который будет возвращать только форму "form": form, когда пользователь не зарегистрирован)

Я не совсем правильно подхожу к этому? Кто-нибудь может мне показать, что я делаю неправильно?

:: Edit ::

Кроме того, я заметил, что у меня не было signup.form в возвращении, но это все равно выдает

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

ошибка. Я изменил код выше, чтобы учесть, что

Ответы [ 3 ]

2 голосов
/ 19 апреля 2011

Я бы просто отметил, что то, как вы это делаете, - очень плохая идея.У вас есть один экземпляр формы в каждом запросе: это всегда будет опасно, что может привести к утечке информации между запросами.Не делайте этого.

Вместо этого используйте встроенный механизм, который Django должен сделать для вас: контекстные процессоры .В вашем signup / form.py определите простую функцию:

def signup_form(request):
    return SignupForm()

и добавьте ее к TEMPLATE_CONTEXT_PROCESSORS в settings.py:

'signup.form.signup_form',
1 голос
/ 19 апреля 2011

Я не уверен, что вы пытаетесь сделать, присвоив ему идентификатор?

Я бы сделал это:

#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),
    ) 

ИЛИ

#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),
    ) 

ОБНОВЛЕНИЕ

Измените свой form.py на:

class SignUpForm(forms.Form):

вместо:

class SignupForm(forms.Form):
1 голос
/ 19 апреля 2011

Вы должны использовать from signup import form или from signup import *, чтобы сделать переменную form доступной в вашем views.py. Если вы сделаете import signup, он импортирует модуль с пространством имен signup и для обращения к форме вам нужно будет сделать signup.form.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...