is_valid всегда False (Джанго) - PullRequest
0 голосов
/ 16 мая 2011

У меня есть следующая форма с динамическими полями:

1 ) В models.py Я хочу передать значение в форму для запроса

class InsertValuesForm(forms.Form):
    def __init__(self, idfield, *args, **kwargs):           

        super(InsertValuesForm, self).__init__(*args, **kwargs)

        for f in Parameter.objects.filter(id=idfield):          

            if Part.objects.get(parameter=f.parameter_name).isfunction:
                self.fields.update({
                            f.parameter_name) : forms.CharField(widget=forms.TextInput() )})

1) В views.py

def something(request)
#......
                idfield = request.GET.get('feid','0')

                form = InsertValuesForm(request.POST,idfield)

                if request.method == 'POST':

                    if form.is_valid():

                       #some code

                else:

                    form = InsertValuesForm(idfield)

                return render_to_response('fuzz/configuration.html', {
                'form': form,
            },context_instance=RequestContext(request))

В ситуации с номером 1 мне удалось отобразить динамические поля в цикле for. Тем не менее, форма выдала мне эту ошибку после заполнения всех полей и отправки (POST):

Аргумент int () должен быть строкой или числом, а не QueryDict. Я думал, что это запрос. Post вызывает ошибку. после некоторого исследования этой проблемы, были похожие решения:

http://groups.google.com/group/django-users/browse_thread/thread/ddefd76324ffe6cd http://groups.google.com/group/django-users/browse_thread/thread/495a917396b20b37/c430d71a31204e5d#c430d71a31204e5d

2) В models.py

class InsertValuesForm(forms.Form):
    def __init__(self, *args, **kwargs):

        idfield = kwargs.pop('idfield', False)

        super(InsertValuesForm, self).__init__(*args, **kwargs)

        for f in Parameter.objects.filter(id=idfield):          

            if Part.objects.get(parameter=f.parameter_name).isfunction:
                self.fields.update({
                            f.parameter_name) : forms.CharField(widget=forms.TextInput() )})

и

следующий фрагмент файла views.py (такой же, как номер 1)

def something(request)
#......
                idfield = request.GET.get('feid','0')

                form = InsertValuesForm(request.POST,idfield)

                if request.method == 'POST':

                    if form.is_valid():

                       #some code

                else:

                    form = InsertValuesForm(idfield)

                return render_to_response('fuzz/configuration.html', {
                'form': form,
            },context_instance=RequestContext(request))

Теперь вышеприведенный код даже не отображает динамические текстовые поля, а просто отображается как пустая страница. Спасибо, если кто-нибудь может пролить свет на

как отображать эти динамические текстовые поля и в то же время, получение значений этих текстовых полей через request.POST, а также проверка формы. Спасибо

1 Ответ

1 голос
/ 16 мая 2011

Вы изменили подпись формы __init__, чтобы первый позиционный параметр был idfield. Не делайте этого, потому что теперь, когда вы создаете его с помощью form = InsertValuesForm(request.POST,idfield), он принимает первый параметр, равный idfield, а не request.POST.

Вместо этого определите метод следующим образом:

 def __init__(self, *args, **kwargs):
      idfield = kwargs.pop('idfield', None)
      ...etc...

и создать его с ключевым словом arg:

form = InsertValuesForm(request.POST, idfield=idfield)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...