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

Модель
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 нет среди допустимых значений.
vak
А такой вопрос, может кто поможет?

is_valid() проверяет заполнение всех полей формы. Как разрешить наличие по некоторым полям пустых значений? В модели пробовал прописывать null=True и blank=True - не помогло.
pill
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/
Там все есть.
vak
pill, спасибо за помощь!

Позволяет полностью признать форму is_valid-ной.
somefield = forms.BooleanField(required=False)
А если некоторые (не все поля) должны быть заполнены корректно? Как обеспечить выборочную проверку?
pill
somefield = forms.BooleanField(required=False) - позволяет оставить поле пустым, на проверку корректности переданных значений это не влияет.

Добавить свои медтоды проверки можно через clean_имя_поля
https://docs.djangoproject.com/en/dev/ref/forms/validation/#cleaning-a-specific-field-attribute
vak
pill, да работает, спасибо.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB