2015-11-19 2 views
1

Я все еще изучаю Django. У меня есть мастер, как рабочий процесс формы, где каждая форма заполняет информацию последовательно.Форма Django не действительна по форме модели

У меня есть форма модели, которая представляет то, что я хочу, введенный из формы:

models.py

class AccountParameters(models.Model): 
    acctFilterName = models.ForeignKey(AccountFilters) 
    excludeClassification = models.ManyToManyField(ClassificationNames) 
    tradingCash = models.FloatField() 

Forms.py

Это упрощенная вниз форма и не представляет реальной реализации. Это было для тестирования.

class AccountSelectionForm(forms.ModelForm): 

acctFilterName = forms.ModelChoiceField(queryset=AccountFilters.objects.all().values_list('acctFilterName', flat=True), 
              label="Account Filters:", 
              empty_label="Select Here..." 
              ) 

excludeClassification = forms.ModelMultipleChoiceField(queryset=ClassificationNames.objects.all().values_list('classificationName', flat=True), 
               label="Classifications Exclusion:" 
              ) 

tradingCash = forms.IntegerField(label="Remove accounts whose trading cash < % of AUM") 


class Meta: 
    model = AccountParameters 
    fields =['excludeClassification', 'tradingCash',] 
    exclude = ['acctFilterName'] 
    labels = { 
     'acctFilterName': _('Account Filters:') 
    } 

views.py

def accountSelections(request): # NewRebalnce 2: AccountParameters with Accounts and Trading Form 

if request.method == "POST": 
    form = AccountSelectionForm(request.POST) 

    if form.is_valid(): 

     accountParameters = AccountParameters 


    #tradingCash = form.cleaned_data['tradingCash'] 

    return render(request, 'NewRebalance_3.html', {'model_selection_form': ModelSelectionForm()}) 
else: 
    form = AccountSelectionForm() 
return render(request, 'NewRebalance2.html', {'account_selections_form': form}) 

Я не уверен, что я правильно используя Modelforms. То, что мне было нужно, это способ создать выделение для моего acctFilterName, поэтому я создал запрос вручную.

Когда я сохраняю форму, она недействительна и в форме очищенных данных я получаю следующее: Обратите внимание, что очищенные данные имеют только поле tradingCash.

Что я делаю неправильно? Есть лучший способ сделать это? Почему форма действительна?

Screenshot of Debug

+0

Где в view.py Вы сохранили форму? –

+0

Я не потому, что form.is_valid() FALSE – Axwack

ответ

-1

Почему вы повторное объявление полей на вашем AccountSelectionForm ModelForm ???

Лучше так:

class AccountSelectionForm(forms.ModelForm): 

    def __init__(self, *args, **kwargs): 
     self.fields['excludeClassification'].queryset = ClassificationNames.objects.all().values_list('classificationName', flat=True) 
     self.fields['acctFilterName'].queryset = AccountFilters.objects.all().values_list('acctFilterName', flat=True) 

    class Meta: 
     model = AccountParameters 
     fields =['excludeClassification', 'tradingCash',] 
     exclude = ['acctFilterName'] 
     labels = { 
      'acctFilterName': _('Account Filters:') 
     } 
+0

Добро пожаловать в переполнение стека. Это должно быть комментарий и не должно появляться в качестве ответа, сначала отправьте свои вопросы в раздел комментариев. –

+0

Извините, но я не могу комментировать :(, недостаточно репутации. –

+0

Итак, это моя нехватка знаний о том, как это работает. AcctFilter - это поиск. Я хочу, чтобы это было запрошено на бэкэнд в качестве поля modelchoice, но не могло так что. Обратите внимание, что в наборе запросов я явно заполняю значения для виджета. – Axwack

1

попытка удалить .values_list('acctFilterName', flat=True) из ModelChoiceField и удалить .values_list('classificationName', flat=True) из ModelMultipleChoiceField.

Они должны быть такими:

acctFilterName = forms.ModelChoiceField(
queryset=AccountFilters.objects.all(), 
label="Account Filters:", 
empty_label="Select Here...") 

excludeClassification = forms.ModelMultipleChoiceField(
queryset=ClassificationNames.objects.all(), 
label="Classifications Exclusion:") 

.values_list лишит вашу QuerySet всех данных, которые ModelChoiceField необходимо признать пункт, оставив только модели поля, указываемых в качестве аргумента. А именно, то, что вы удаляете здесь, является основным ключом модели, которая является фундаментальной.

+0

Проблема с тем, что вы объясняете, заключается в том, что объекты тогда не позволяют вам выбирать раскрывающееся меню по имени. Values_list позволяет вам выбрать имя. Я думаю, что здесь что-то еще отсутствует, я не понимаю. – Axwack

+0

У вас есть 2 варианта решения этой проблемы. 1: создайте «def __unicode __ (self):» метод используемой модели, который возвращает то, что вы хотите отобразить в качестве опции выпадающего списка. 2: передать аргумент to_field_name в ModelChoiceField, который содержит имя поля, которое вы хотите отобразить в качестве опции выпадающего списка. Оба параметра описаны здесь: https://docs.djangoproject.com/en/1.8/ref/forms/fields/#modelchoicefield в разделе «to_field_name». – Saturnix

+0

Извините, я ошибся. «to_field_name» является основным ключом модели, а не тем, что отображается пользователю. То, что отображается пользователю, является результатом метода «def __unicode__» на вашей модели. – Saturnix

Смежные вопросы