Джанго формирует, как получить cleaned_data из полей - PullRequest
0 голосов
/ 28 августа 2018

Я создаю простую динамическую form fields, чтобы пользователь мог добавить свои поля формы, и все поля связаны с category моделью. Я хочу, чтобы, когда пользователь выбирал category с именем car, то показывал им отношение fields к этой машине.

моя структура:

class Category:
    name = ...


class Field:
    label = ...
    category = ForeignKey(Category)


class FieldValue:
    value = ...
    field = ForeignKey(Field)

Моя проблема в том, как мне сгенерировать форму и как извлечь данные из form.cleaned_data, чтобы я мог добавлять записи в модель FieldValue. Я создал форму и она отлично работает для рендеринга с использованием __init__. И я хочу получить данные из визуализированных полей формы.

моя форма:

class CategoryFieldsForm(forms.Form):
    def __init__(self, category_id, *args, **kwargs):
        super(CategoryFieldsForm, self).__init__(*args, **kwargs)

        fields = Field.objects.filter(category_id=category_id)

        for i in range(1, len(fields)):
            for field in fields:
                self.fields[field.slug] = forms.CharField()

    def clean(self):
        # how can i validate

    def save(self):
        print(self.cleaned_data)
        # how can i save fields

мой взгляд:

def some_create_view(request, category_id):
    if request.method == 'POST':
        form = CategoryFieldsForm(category_id)
        form.save()

    form = CategoryFieldsForm(category_id)

    return render(request, 'create.html', {'form': form})

При отправке формы CategoryFieldsForm объект не имеет атрибута cleaned_data отображается.

Ответы [ 3 ]

0 голосов
/ 28 августа 2018

Вам нужно создать экземпляр формы с данными POST, а затем вызвать form.is_valid(), прежде чем вы сможете получить доступ к form.cleaned_data.

def some_create_view(request, category_id):
    if request.method == 'POST':
        form = CategoryFieldsForm(category_id, data=request.POST)
        if form.is_valid():
            form.save()
0 голосов
/ 28 августа 2018

Спасибо за Даниэль Роузман и другие. Это была более простая ошибка, о которой я думал.

if request.method == 'POST':
        form = CategoryFieldsForm(category_id, request.POST)

        if form.is_valid():
            print(form)
        else:
            print(form.errors)

    form = CategoryFieldsForm(category_id)

Я просто забыл этот пропуск request.POST в мою форму.

0 голосов
/ 28 августа 2018

Подробнее о form.is_valid () можно прочитать здесь .

Экземпляр формы имеет метод is_valid (), который выполняет процедуры проверки для всех своих полей. Когда этот метод вызывается, если все поля содержат действительные данные, он будет:

1) вернуть True

2) поместите данные формы в ее атрибут cleaned_data.

def some_create_view(request, category_id):
    if request.method == 'POST':
        form = CategoryFieldsForm(category_id, request.POST)
        if form.valid():                
            # you should be able to access the form cleaned data here
            ....
...