2012-02-24 2 views
0

У меня есть две модели:Почему этот модельный шаблон django недействителен?

ProcessDao 
    ** normal fields ** 
    resource = models.ForeignKey(ResourceData, related_name='processes') 

ResourceData 
    ** Normal Fields ** 

ниже код в моем views.py:

pdForm = ProcessDataForm(request.POST) 
rd = ResourceData.objects.get(pick_date__exact = request.POST['pick_date']) 
pdForm.resource = rd <------ here is the assignment 
if pdForm.is_valid(): 
    pdForm.save() 
else: 
    print 'pdForm is not valid ! ', pdForm.errors 
    # print "resource is not valid." 

Есть ли способ сделать pdForm действительным?

+0

Вы можете попробовать напечатать pdForm.errors –

+0

** pdForm не действует !

  • resource
    • Это поле обязательно для заполнения.
** – MrROY

+0

А, так как-то единственный ресурс поля пуст. Возможно, вам потребуется проверить 'rd', чтобы узнать, является ли оно нулевым или нет. –

ответ

1

Не должны ли вы работать на очищенной форме, чтобы назначить пустые поля? Попробуйте что-то вроде:

if pdForm.is_valid(): 
    cleanform = pdForm.save(commit = False). 
    cleanform.resource = rd 
    cleanform.save() 

Я просто не уверен, что он будет работать с ресурсом является единственным полем в модели. Я django noob, но он работает для меня с назначением полей ForeignKey во многих формах.

+0

** pdForm.is_valid() ** возвращает False, поэтому следующий код не будет выполнен. И если я попытаюсь выполнить pdForm.save (commit = False) до проверки, ошибка будет ** «ProcessData не может быть потому что данные не проверялись ». ** – MrROY

+0

Попробуйте pdForm.fields ['resource'] = rd.id перед pdForm.is_valid(), затем выполните .is_valid() и save(). Я считаю, что это способ изменить поля формы перед очисткой данных. Если это не поможет, у меня нет идей. – Marek

+0

это pdForm.fields ['resource'] = rd, not rd.id – Marek

1

Почему вы думаете, что назначение случайного атрибута объекту формы сделает его действительным? Нет никакого смысла, когда форма использует свои атрибуты экземпляра, чтобы проверить его достоверность, и ничто в документации не подразумевает, что это делает.

Есть несколько способов исправить это правильно. Во-первых, и, вероятно, самое уродливое, нужно скопировать request.POST и вставить туда идентификатор соответствующего объекта. (Вам нужно скопировать его, поскольку исходный экземпляр является неизменным).

Намного лучше, чтобы исключить поле из формы в целом (через Meta классе формы), так и в предложении is_valid сделать это:

object = pdForm.save(commit=False) 
rd = ResourceData.objects.get(pick_date__exact = pdForm.cleaned_data['pick_date']) 
object.resource = rd 
object.save() 
Смежные вопросы