代码之家  ›  专栏  ›  技术社区  ›  ccsv

Django在带有父对象的创建视图中创建多个子对象

  •  0
  • ccsv  · 技术社区  · 6 年前

    我有两个模型是由一个外键关联的。我试图在创建视图的表单字段中添加逻辑,在该视图中,用户填写一个数字n,它在数据库中生成n个项。

    型号.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())
    

    视图.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')
    

    表格.py

    如果 items 字段由用户填充,它应该在数据库中生成n个项。我采用的当前方法存在覆盖save函数的问题。不确定是否需要使用inline表单集

     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 回复  |  直到 6 年前
        1
  •  0
  •   ccsv    6 年前

     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 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})