2016-01-17 5 views
0

Я хотел бы обратиться за помощью и руководством по моей проблеме.Django: сохранение динамических форм с внешним ключом

У меня есть следующие модели:

class myinfo(models.Model): 
    name = models.CharField(max_length=30, null=True) 


class mynumbers(models.Model): 
    fkey = models.ForeignKey("myinfo") 
    Job_Position = models.CharField(max_length=30, null=True) 

mynumbers модель динамически сгенерированные с помощью django-dynamic-formset.

Моя форма

class info(ModelForm): 
    name= forms.CharField(max_length=20) 

    class Meta: 
     model = APPLICANT_DATA 
     fields = ('name',) 

class numbers(ModelForm): 
    number = forms.CharField(max_length=20) 

    class Meta: 
     model = APPLICANT_DATA 
     fields = ('number',) 

Если вы хотите, чтобы сохранить динамические поля формы, вы должны сделать это в представлениях

for field in formset: 
    field.save() 

Мои взгляды:

def index(request): 

    aformset = formset_factory(numbers) 
    formset = aformset(request.POST) 
    form = info(request.POST) 

    if request.method == 'POST': 

     if form.is_valid(): 
      if formset.is_valid(): 
       for field in formset: 
        formset.save() 

       form.save() 

Но проблема начинается когда мое динамически генерируемое поле имеет внешний ключ (mynumbers), который вызывает ошибку must be a myinfo instance. Как бы сохранить 2 формы, где mynumbers имеет ключ foriegn для myinfo? Есть ли лучший способ сделать то, что я сделал? Заранее благодарю вас,

ответ

0

Здесь inlineformset_factory будет использоваться. Это позволяет вам иметь родительскую модель и ряд дочерних моделей (связанных с родителем через внешний ключ) и сохранять их вместе. Существует много аргументов, которые могут быть переданы inlineformset_factory, чтобы настроить поведение (например, минимальное и максимальное количество разрешенных встроенных форм, может ли пользователь удалять встроенные формы и т. Д.), Но суть показана ниже.

# views.py 

from django.forms.models import inlineformset_factory 
from my_app.forms import numbers as NumberForm 
from my_app.forms import info as InfoForm 
from my_app import models 

myFormset = inlineformset_factory(models.myinfo, 
    models.mynumbers, 
    form=NumberForm 
) 

def index(request): 
    if request.POST: 
     form = InfoForm(request.POST) 
     if form.is_valid(): 
      info = form.save(commit=False) 
      formset = myFormset(request.POST, instance=info) 
      if formset.is_valid(): 
       info.save() 
       formset.save() 
       return HttpResponse('saved successfully') 
    else: 
     form = InfoForm() 
     formset = myFormset(instance=models.myinfo()) 
    return render_to_response("recipes/submit.html", { 
                "form": form, 
                "formset":formset,  
                }, 
          context_instance=RequestContext(request)) 

Обратите внимание: В вашем вопросе, вы набрали for field in formset: formset.save(). Набор форм - это набор форм, а не набор полей.

Формы могут быть сложными и требуют правильного отображения шаблона с дополнительными компонентами шаблона, которые не являются частью обычных форм (например, переменная management_form, которая позволяет Django правильно обрабатывать то, что было добавлено/удалено/перемещено/изменено). Конечно, стоит сделать несколько руководств, чтобы получить представление о лучших практиках, чтобы вы не справлялись с поиском решения проблемы с вашей пользовательской реализацией. Я предлагаю this post from Charles Leifer как хороший вход, чтобы познакомиться с основами.

+0

Спасибо за ответ. Всякий раз, когда я пытаюсь сохранить 'formet', он всегда вызывает ошибку, говоря, что нет' formset.save() ', но когда я его зацикливал, он сохраняет, в любом случае, я попробую ответ для немного спасибо. –

+0

Убедитесь, что у вас есть myFormset = inlineformset_factory (models.myinfo, models.mynumbers, form = NumberForm ) за пределами вашего зрения; это необходимо в дополнение к созданию экземпляра вашего набора форм с помощью formet = myFormset (instance = ...) внутри представления. –

+0

Отлично работает, спасибо, как работает 'inlineformset_factory'? –

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