Python 使用For循环创建Django表单字段
我有3种型号: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
# 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')