#python #django #forms
#python #django #формы
Вопрос:
Итак, у меня есть эти две формы. Я хотел бы иметь возможность доступа к данным в форме env_form, когда я проверяю add_uRG для моей другой формы. Возможно ли это сделать? Моя форма env — это очень распространенная форма в моем приложении, поэтому я хотел бы сохранить ее отдельно, а не включать в каждую форму.
class env_form(forms.Form):
env = forms.ChoiceField(choices=ENV, required=True)
class add_uRG(forms.Form):
user = forms.CharField(max_length=50)
group = forms.CharField(required=True)
role = forms.CharField(required=True)
def clean_user(self):
post_user = self.cleaned_data['user']
post_env = self.cleaned_data['env']
c = User.objects.filter(user__contains=post_user, env__contains=post_env ).count()
if (c == 0):
raise forms.ValidationError(u"User Not Found.")
else:
user_info = User.objects.filter(user__contains=post_user).values('password').distinct().count()
user_env = User.objects.filter(user__contains=post_user).values('env').distinct().count()
if not (user_env == user_info):
raise forms.ValidationError(u'User is using same password')
return(post_user)
Ответ №1:
Если я правильно прочитал ваш вопрос, я думаю, что здесь можно было бы использовать наследование формы.
class env_form(forms.Form):
env = forms.ChoiceField(choices=ENV, required=True)
class add_uRG(env_form):
user = forms.CharField(max_length=50)
group = forms.CharField(required=True)
role = forms.CharField(required=True)
def clean_user(self):
post_user = self.cleaned_data['user']
post_env = self.cleaned_data['env']
c = User.objects.filter(user__contains=post_user, env__contains=post_env ).count()
if (c == 0):
raise forms.ValidationError(u"User Not Found.")
else:
user_info = User.objects.filter(user__contains=post_user).values('password').distinct().count()
user_env = User.objects.filter(user__contains=post_user).values('env').distinct().count()
if not (user_env == user_info):
raise forms.ValidationError(u'User is using same password')
return(post_user)
def __init__(self, *args, **kwargs):
super(env_form, self).__init__(*args, **kwargs)
class SomeOtherForm(env_form):
some_field = forms.CharField()
def __init__(self,*args,**kwargs):
super(env_form, self).__init__(*args,**kwargs)
Комментарии:
1. хм, похоже, у меня это не работает. Я пробую этот метод, но он не подключается к моему clean_user
2. Спасибо, я заставил вас работать. Оказывается, моя форма была испорчена, но как только я запустил ее, ваша заработала нормально. Спасибо!
Ответ №2:
Вы могли бы присвоить свойство вашей форме add_uRG после проверки env_form, или вы могли бы передать значение в форму add_uRG в качестве параметра.
#forms.py
class AdduRGForm(forms.Form):
def __init__(self, *args, **kwargs):
super(AdduRGForm, self).__init__(*args, **kwargs)
self.env = None
#my_view.py
def my_view(request):
env_form = env_form(request.POST or None)
if request.POST:
if env_form.is_valid():
add_uRG_form = AdduRGForm(request.POST or None)
add_uRG_form.env = env_form.cleaned_data.get('env')
if add_uRG_form.is_valid():
#do something else
return render_to_response('template.html',
{'env_form' : env_form, 'add_uRG_form' : add_uRG_form})
Я не совсем уверен в вашем рабочем процессе, поэтому, если эти формы не существуют в одном представлении, например, если вы сначала обрабатываете env_form, а затем переходите к другому представлению и вам требуется значение, которое кто-то ранее выбрал, вы могли бы передать запрос в env_form и установить выбор в сеансе, который вы могли бы снова выбрать во второй форме, используя описанный мной метод.
Комментарии:
1. Я добавил инициализацию , но не уверен, работает она или нет. Как только я пытаюсь проверить свою форму, она просто возвращает мне форму и не выполняет код в моем #do something else. Я попытался выполнить печать self.env в моем clean_user (self): def, но это не сработало
2. Я внес незначительные изменения в ваш код pastebin в представлении: pastebin.com/HbARraEQ
3. да, я забыл внести это изменение, но у меня все равно не сработало. Но я выяснил, что моя форма обрабатывалась неправильно. Но даже с вашим изменением он по-прежнему говорит, что не может обработать очередь как None. Таким образом, он все еще не получает env из первой формы.
4. Хм. Без фактической настройки проекта и работы с этим довольно сложно определить, почему значение env не было бы в очищенных данных первой формы, но именно это я бы искал дальше. Я много раз использовал шаблон установки свойства в форме, а затем заполнения его из другой формы, поэтому я почти уверен, что это сработает так, как рекламируется.
5. да, я вижу это в аргументах, когда они передаются в init (<QueryDict: {u’role’: [u’role-c’], u’group’: [u’group-b’], u’user’: [u’user’a’], u’env’: [u’dev’]}>,) но self.env=None просто остается как none .