Как связать вход в форму с моделью в Django? - PullRequest
2 голосов
/ 03 августа 2009

Как в Django связать форму с моделью, чтобы данные, введенные в форму, вставлялись в таблицу базы данных, связанную с моделью? Как сохранить этот пользовательский ввод в эту таблицу базы данных?

Например:

class PhoneNumber(models.Model):
    FirstName = models.CharField(max_length=30)
    LastName = models.CharField(max_length=30)
    PhoneNumber = models.CharField(max_length=20)

class PhoneNumber(forms.Form):
    FirstName = forms.CharField(max_length=30)
    LastName = forms.CharField(max_length=30)
    PhoneNumber = forms.CharField(max_length=20)

Я знаю, что есть класс для создания формы из модели, но даже там мне неясно, как данные на самом деле попадают в базу данных. И я хотел бы понять внутреннюю работу, прежде чем перейти к экономии времени. Если есть простой пример того, как это работает в документах, я пропустил это.

Спасибо.

ОБНОВЛЕНИЕ: Чтобы быть ясным - я знаю об инструменте ModelForm, я пытаюсь выяснить, как сделать это без этого - отчасти, чтобы я мог лучше понять, что он делает в первую очередь.

ОТВЕТИЛ:

С помощью ответов я пришел к этому решению:

Определение формы:

class ThisForm(forms.Form)
    [various Field assignments]

    model = ThisModel()

Код в представлениях для сохранения введенных данных в базу данных:

if request_method == 'POST':
    form = ThisForm(request.POST)
    if form.is_valid():
        for key, value in form.cleaned_data.items():
            setattr(form.model, key, value)
        form.model.save(form.model)

После этого данные, введенные в форму браузера, находились в таблице базы данных.

Обратите внимание, что вызов метода save () модели требовал передачи самой модели в качестве аргумента. Понятия не имею почему.

ПРЕДУПРЕЖДЕНИЕ: Я новичок. Это позволило получить данные из браузера в таблицу базы данных, но Бог знает только то, что я пренебрег, пропустил или сразу сломал. ModelForm определенно выглядит намного более чистым решением.

Ответы [ 4 ]

3 голосов
/ 04 августа 2009

Вернувшись, когда я впервые использовал формы и модели (без использования ModelForm), я помню, что проверял, была ли форма действительной, что устанавливало бы ваши очищенные данные, вручную перемещая данные из формы в модель (или любую другую обработка, которую вы хотите сделать), а затем сохранение модели. Как вы можете сказать, это было чрезвычайно утомительно, когда ваша форма точно (или даже близко) соответствует вашей модели. Используя ModelForm (поскольку вы сказали, что не совсем уверены, как он работает), при сохранении ModelForm он создает объект с данными формы в соответствии со спецификацией модели, а затем сохраняет эту модель для вас. В общем, поток данных идет от формы HTML, к форме Django, к модели Django, к базе данных.

Некоторые актуальные коды для ваших вопросов:

Чтобы получить данные формы браузера в объекте формы:

if request.method == 'POST':
    form = SomeForm(request.POST)
    if form.is_valid():
        model.attr = form.cleaned_data['attr']
        model.attr2 = form.cleaned_data['attr2']
        model.save()
else:
    form = SomeForm()
return render_to_response('page.html', {'form': form, })

На странице шаблона вы можете делать такие вещи с помощью формы:

<form method="POST">
{{ form.as_p }}
<input type="submit"/>
</form>

Это только один пример, который я взял из здесь .

2 голосов
/ 03 августа 2009

Я не уверен, какой класс ты имеешь в виду. Я знаю, что был помощник, что-то вроде form_for_model (не помню точное имя; это было еще до выпуска версии 1.0). Прямо сейчас я бы так сказал:

import myproject.myapp.models as models

class PhoneNumberForm(forms.ModelForm):
    class Meta:
        model = models.PhoneNumber

Чтобы увидеть магию метакласса, вам нужно заглянуть в код, так как есть много объяснений:]. Конструктор формы может принимать аргумент instance. Его передача заставит форму работать с существующей записью, а не создавать новую. Подробнее здесь .

1 голос
/ 03 августа 2009

Я думаю, ModelForm.save документация должна объяснить это. С его базовым классом (Form) вам потребуется использовать Form.cleaned_data (), чтобы получить значения полей и установить их в соответствующие поля модели «вручную». ModelForm сделает все это за вас.

0 голосов
/ 04 августа 2009

Документация по Django довольно ясна по этому вопросу. Однако вот примерное руководство для начала: вы можете либо переопределить метод сохранения формы, либо реализовать эту функциональность в представлении.

if form.is_valid() # validation - first the fields, then the form itself is validated
    form.save()

внутри формы:

def save(self, *args, **kwargs):
    foo = Foo()
    foo.somefield = self.cleaned_data['somefield']
    foo.otherfield = self.cleaned_data['otherfield']
    ...
    return foo.save()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...