Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 21, 2011 06:30:01

vak
От:
Зарегистрирован: 2007-05-04
Сообщения: 262
Репутация: +  0  -
Профиль   Отправить e-mail  

form.is_valid()

Не могу победить … при заполненный полях (при выбранных значениях) - выдает ошибку. Подскажите плиз как побороть?

Модель

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

class Atc(models.Model):
id = models.AutoField(primary_key=True)
atc_name = models.CharField(unique=True,max_length=100)
email = models.EmailField(null=True,max_length=50)
phone = models.CharField(null=True,max_length=50)
class Meta:
db_table = u'atc'
permissions = (("read_atc","право на чтение"),("add_atc","право на добавление"),("change_atc","право на изменение"),("delete_atc","право на удаление"),)


class Atc2Users(models.Model):
id = models.AutoField(primary_key=True)
atc = models.ForeignKey(Atc)
user = models.ForeignKey(User,unique=True)
class Meta:
db_table = u'atc2users'
permissions = (("read_atc2users","право на чтение"),("add_atc2users","право на добавление"),("change_atc2users","право на изменение"),("delete_atc2users","право на удаление"),)
Форма
#coding:utf-8
from django import forms
from django.forms import ModelForm
from tss.journals.models import Atc
from tss.journals.models import Atc2Users


class A2U(ModelForm):
atc = forms.ChoiceField(label='ЭТЦ:')
user = forms.ChoiceField(label='Пользователь:')
class Meta:
model = Atc2Users
fields = ('atc','user')
Обработка формы
#coding:utf-8
from django.shortcuts import render_to_response
from tss.forms.spr import A2U
from django.contrib.auth.models import User
from django.contrib.auth.decorators import login_required
from django.contrib.auth.decorators import permission_required
from tss.journals.models import Atc
from tss.choices import USER_LIST
from tss.choices import ATC_LIST
from tss.journals.models import Atc2Users



### --- Добавление записи ---
def add(request):

action = 'new'

error = ''


## --- Для заполнения ----
try:
spr = A2U(request.POST)
user_kod = request.POST['user']
atc_kod = request.POST['atc']
u = User.objects.get(pk=user_kod)
a = Atc.objects.get(pk=atc_kod)


if spr.is_valid():
a2u = Atc2Users()
a2u.atc = a
a2u.user = u
a2u.save()
return render_to_response('atc2users.html',{'a2u1':get_list()[0:39],'a2u2':get_list()[40:89],'error':error})

else:
error = 'Выбирете значение!'

except:
spr = A2U()

spr.fields['user'].choices = USER_LIST(first=1)
spr.fields['atc'].choices = ATC_LIST(first=1)

return render_to_response('atc2useradd.html',{'spr':spr,'error':error,'action':action})
Видимо возможные значения выпадающего списка где то нужно указать - но где?
Выберите корректный вариант. 2 нет среди допустимых значений.



Отредактировано (Сен. 21, 2011 10:24:48)

Офлайн

#2 Сен. 22, 2011 04:37:49

vak
От:
Зарегистрирован: 2007-05-04
Сообщения: 262
Репутация: +  0  -
Профиль   Отправить e-mail  

form.is_valid()

А такой вопрос, может кто поможет?

is_valid() проверяет заполнение всех полей формы. Как разрешить наличие по некоторым полям пустых значений? В модели пробовал прописывать null=True и blank=True - не помогло.



Офлайн

#3 Сен. 22, 2011 10:14:03

pill
От:
Зарегистрирован: 2010-08-27
Сообщения: 223
Репутация: +  0  -
Профиль   Отправить e-mail  

form.is_valid()

vak
А такой вопрос, может кто поможет?
is_valid() проверяет заполнение всех полей формы. Как разрешить наличие по некоторым полям пустых значений? В модели пробовал прописывать null=True и blank=True - не помогло.
somefield = forms.BooleanField(required=False)
По первому посту:
Зачем обьявлять modelform и потом мутузить ее как обычную форму?
Попробуйте форму вот так сделать:
class   A2U(ModelForm):
class Meta:
model = Atc2Users
# и выбросьте:
spr.fields['user'].choices = USER_LIST(first=1)
spr.fields['atc'].choices = ATC_LIST(first=1)

# Обработчик
def add(request):
action = 'new'
# errorы опять же лучше встроенные использовать.
error = 'выберите значение'
spr_form = A2U()

if request.method == 'POST':
spr_form = A2U(request.POST)
if spr_form.is_valid():
spr_form.save()
error = ''
return render_to_response('atc2users.html',{'a2u1':get_list()[0:39],'a2u2':get_list()[40:89],'error':error})

return render_to_response('atc2useradd.html',{'spr':spr_form,'error':error,'action':action})
Django сама передаст все что нужно.
Я не до конца разобрался с логикой в вашей функции… но вцелом идея надеюсь понятна.

по валидации: https://docs.djangoproject.com/en/dev/ref/forms/validation/
по modelform: https://docs.djangoproject.com/en/dev/topics/forms/modelforms/
Там все есть.



Отредактировано (Сен. 22, 2011 10:42:12)

Офлайн

#4 Сен. 23, 2011 11:48:59

vak
От:
Зарегистрирован: 2007-05-04
Сообщения: 262
Репутация: +  0  -
Профиль   Отправить e-mail  

form.is_valid()

pill, спасибо за помощь!

Позволяет полностью признать форму is_valid-ной.

somefield = forms.BooleanField(required=False)
А если некоторые (не все поля) должны быть заполнены корректно? Как обеспечить выборочную проверку?



Офлайн

#5 Сен. 23, 2011 14:25:04

pill
От:
Зарегистрирован: 2010-08-27
Сообщения: 223
Репутация: +  0  -
Профиль   Отправить e-mail  

form.is_valid()

somefield = forms.BooleanField(required=False) - позволяет оставить поле пустым, на проверку корректности переданных значений это не влияет.

Добавить свои медтоды проверки можно через clean_имя_поля
https://docs.djangoproject.com/en/dev/ref/forms/validation/#cleaning-a-specific-field-attribute



Офлайн

#6 Сен. 26, 2011 05:48:46

vak
От:
Зарегистрирован: 2007-05-04
Сообщения: 262
Репутация: +  0  -
Профиль   Отправить e-mail  

form.is_valid()

pill, да работает, спасибо.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version