Django Создать несколько дочерних объектов в представлении создания с родительским объектом - PullRequest
0 голосов
/ 09 июня 2018

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

Model.py

class Environment(models.Model):
    name = models.CharField(max_length=50)

class Item(models.Model):
    environment = models.ForeignKey(Environment, on_delete=models.CASCADE)
    uid = models.CharField(max_length=50, unique=True, null=True, blank=True)
    def __init__(self):
        super(Item, self).__init__()
        self.uid = str(uuid.uuid4())

view.py

class EnvironmentCreateView(CreateView):
    '''View for creating Environments'''
    model = Environment
    form_class = EnvironmentCreateForm
    template_name = 'Environment_create.html'
    success_url = reverse_lazy('main:Environment list')

forms.py

Если поле items заполнено пользователем, онодолжен сгенерировать n элементов в базе данных.У текущего подхода, который я выбрал, есть проблема, перекрывающая функцию сохранения.Не совсем уверен, нужно ли мне использовать inline_formeset

 class EnvironmentCreateForm(forms.ModelForm):
        name =forms.CharField(max_length=50, required=True, label='Product Name')
        items =forms.IntegerField(min_value =0, max_value = 100,required=False, label='Number of Items')
        class Meta:
            model = Environment
            fields = ['name',]

        def save(self):
            if Environment.is_valid(): 
                Environment.save() 
            if self.items >= 0:
                for i in range(self.items):
                   Item.objects.create(Environment, uid =str(uuid.uuid4()) )

1 Ответ

0 голосов
/ 22 июня 2018

Я нашел ответ на этот вопрос, но он основан на функциях:

forms.py Избавиться от нижней части

 class EnvironmentCreateForm(forms.ModelForm):
        name =forms.CharField(max_length=50, required=True, label='Product Name')
        items =forms.IntegerField(min_value =0, max_value = 100,required=False, label='Number of Items')
        class Meta:
            model = Environment
            fields = ['name',]

views.py

def EnvironmentCreateView(request):

    if request.method == 'POST':
        form =  EnvironmentCreateForm(request.POST)
        if form.is_valid():
            name =form.cleaned_data['name']
            items =form.cleaned_data['items']
            env = form.save(commit = False) # this item must be saved first before using the id for the second item
            env.save()
            if units is not None:
                for i in items:
                    Item.objects.create(environment =env)
    else:
            form =  EnvironmentCreateForm()
        return render(request, 'HTMLPAGE.html', {'form': form})
...