Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用For循环创建Django表单字段_Python_Django_Django Models_Django Forms - Fatal编程技术网

Python 使用For循环创建Django表单字段

Python 使用For循环创建Django表单字段,python,django,django-models,django-forms,Python,Django,Django Models,Django Forms,我有3种型号: # app/models.py class Platform(models.Model): name = models.CharField(max_length=50) def __str__(self): return self.name class Streamer(models.Model): name = models.CharField(max_length=50) def __str__(self

我有3种型号:

# app/models.py


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

    def __str__(self): 
        return self.name

class Streamer(models.Model): 
    name = models.CharField(max_length=50)
    
    def __str__(self): 
        return self.name

class Account(models.Model): 
    name = models.CharField(max_length=50)
    streamer = models.ForeignKey(Platform, on_delete=models.CASCADE)
    platform = models.ForeignKey(Platform, on_delete=models.CASCADE)

    def __str__(self): 
        return self.name
在平台模型中,我有3个对象(Instagram、Twitch、YouTube):

我想要一个拖缆创建表单:

  • 创建拖缆对象
  • 为每个可用平台创建一个帐户(所有可选)
  • 最后,我希望表单如下所示:

    # app/forms.py
    
    
    class StreamerForm(forms.Form):
        streamer = CharField(max_length=50)
        instagram_username = CharField(max_length=50)
        twitch_username = CharField(max_length=50)
        youtube_username = CharField(max_length=50)
    
    但无需在用户名字段中手动定义每个平台,例如:

    # app/forms.py
    
    
    class StreamerForm(forms.Form):
        streamer = CharField(max_length=50):
        for platform in platforms: 
            # somehow...
            platform_username = models.CharField(max_length=50)
    
    做这件事最好的方法是什么? 不确定是否需要共享此部分,但视图是这样的:

    # app/forms.py
    
    
    class StreamerCreate(View):
        def get(self, request):
            form = StreamerForm()
            return render(request, 'app/streamer_create.html', {'form':form})
    
        def post(self, request): 
            form  = StreamerForm(request.POST)
            if form.is_valid:
                # Create the streamer
                streamer = Streamer.objects.create(name=form.cleaned_data['streamer'])
                # Create one account for each platform and assign it to the streamer
                for platform in Platform.objects.all():
                    if form.cleaned_data[f'{platform.name.lower()}_username']:
                         username = form.cleaned_data[f'{platform.name.lower()}_username']
                         Account.objects.create(name=username, platform=platform, streamer=streamer)
                return redirect('home')
    
    

    找不到一个清晰的副本来清楚地回答这个问题,但是如果有一个好的对Django的新用户说得很好请随意分享。

    我想要一个
    ChoiceFields
    的表单,其中的选项是从外部API检索的。因为我不知道这些值是什么,所以我似乎也想做同样的事情。只要用我在json响应中循环时生成的字段构建一个表单就可以了。因为我不知道这些值是什么,所以我似乎也想做同样的事情。只要用我在json响应中循环时生成的字段构建一个表单。
    # app/forms.py
    
    
    class StreamerCreate(View):
        def get(self, request):
            form = StreamerForm()
            return render(request, 'app/streamer_create.html', {'form':form})
    
        def post(self, request): 
            form  = StreamerForm(request.POST)
            if form.is_valid:
                # Create the streamer
                streamer = Streamer.objects.create(name=form.cleaned_data['streamer'])
                # Create one account for each platform and assign it to the streamer
                for platform in Platform.objects.all():
                    if form.cleaned_data[f'{platform.name.lower()}_username']:
                         username = form.cleaned_data[f'{platform.name.lower()}_username']
                         Account.objects.create(name=username, platform=platform, streamer=streamer)
                return redirect('home')