django - Django 动态表单多对多字段
问题描述
我有一个问题,我想制作一个可以提交首发 XI 名单的足球联赛页面。
但我不知道如何构建动态表单。
用户(即球队所有者)可以登录以选择比赛以上传首发 XI。网站会显示球队的球员名单,让用户选择 Max of 11 并提交。
重要的是
- 如何生成带有“球员所属球队”的表格。
- 如何让用户上传 Home / Away(球队属于用户)仅从 XI 开始。
模型.py
class Schedule(models.Model):
schedule_name = models.CharField(max_length=7, choices=LEAGUE_CHOICES, default='nil')
schedule_home = models.ForeignKey(Team, on_delete=models.CASCADE,default='',related_name='schedule_home')
schedule_away = models.ForeignKey(Team, on_delete=models.CASCADE,default='',related_name='schedule_away')
class Player(models.Model):
user = models.OneToOneField(User,on_delete=models.CASCADE)
player_name = models.CharField('Player Name', max_length=30, unique=True)
player_team = models.ForeignKey(Team ,on_delete=models.SET_DEFAULT, default=1)
class Team(models.Model):
team_name = models.CharField('Team Name', max_length=30, unique=True)
team_owner = models.OneToOneField(User,on_delete=models.CASCADE,related_name='owner')
class Match_Starting(models.Model):
starting_schedule = models.OneToOneField(Schedule,on_delete=models.CASCADE)
home_starting = models.ManyToManyField(Player,blank=True,related_name='home_starting')
away_starting = models.ManyToManyField(Player,blank=True,related_name='away_starting')
@receiver(post_save, sender=Schedule)
def create_match_stat(sender, instance, created, **kwargs):
if created:
Match_Starting.objects.create(starting_schedule=instance)
表格.py
class MatchStartingForm(forms.ModelForm):
class Meta:
model = Match_Starting
fields = '__all__'
视图.py
@login_required
def update_starting(request):
if request.user.is_authenticated:
try:
selected_team = Team.objects.get(team_owner=request.user)
except:
return HttpResponseRedirect('/')
if request.method == 'GET':
selected_player = Player.objects.filter(player_team=selected_team).order_by('player_name')
team_schedule_list = Schedule.objects.filter(schedule_time__lte=datetime.datetime.now() + datetime.timedelta(weeks=1),schedule_time__gte=datetime.datetime.now() + datetime.timedelta(minutes=30)).filter(Q(schedule_home__team_name=selected_team)|Q(schedule_away__team_name=selected_team))
return render(request, 'update_starting/update_starting.html',{"user":request.user,"team":selected_team,"player":selected_player,"schedule":team_schedule_list})
if request.method == 'POST':
selected_match= get_object_or_404(Match_Starting, starting_schedule__id=request.POST.get("schedule_id"))
request.POST = request.POST.copy()
if selected_team == selected_match.starting_schedule.schedule_home:
request.POST['home_starting'] = request.POST['starting']
form = MatchStartingForm(request.POST, instance=selected_match)
if form.is_valid():
selected_match = form.save(commit=False)
selected_match.save()
form.save_m2m()
elif selected_team == selected_match.starting_schedule.schedule_away:
request.POST['away_starting'] = request.POST['starting']
form = MatchStartingForm(request.POST, instance=selected_match)
if form.is_valid():
selected_match = form.save(commit=False)
selected_match.save()
form.save_m2m()
return HttpResponseRedirect('/')
update_starting.html
<div>
<form action="" method="post">
{% csrf_token %}
<select name="schedule_id">
{% for x in schedule %}
<option value="{{x.id}}">{{x.get_schedule_name_display}} {{x.schedule_home}} - {{x.schedule_away}}</option>
{% endfor %}
</select>
{% for x in player %}
<input type="checkbox" name="starting" value="{{x.id}}">{{x.player_name}}<br>
{% endfor %}
<input type="submit" class="button" value="Save">
</form>
</div>
解决方案
如何生成带有“球员所属球队”的表格。
您首先需要一个玩家表格:
class PlayerForm(forms.ModelForm):
class Meta:
model = Player
fields = '__all__'
然后将其付诸实践:Django Formsets
如何让用户上传 Home / Away(球队属于用户)仅从 XI 开始。
您在这里也需要一个表格,这次也需要Schedule
模型。
@rhurch4 说:他们只想知道如何确保用户只能为他的团队上传名册。
如果是这种情况,您只需确保在Team
列表视图中只列出属于已验证的团队User
。
推荐阅读
- oracle - Oracle SQL 触发器 - 如何阻止调用触发器后发生的查询/过程
- batch-file - 如何使用批处理文件将文件重命名为增量顺序?
- git - Visual Studio Team Explorer - GIT:自动忽略新文件
- java - Shadow Root - 点击几个shadow root下的href
- c++ - QTableWidget 选择矩形即使在编辑完成后也不会消失
- scala - 当数组很大时,在 Scala 中的 Spark Dataframe 中从数组列创建单独的列
- python - OpenCV+python:从 3.4.2 开始访问 HoughLines 累加器
- r - R中聚类中心与异常值之间的距离
- mysql - 使用 NodeJS 从 MySQL 数据库中检索数据并将其传递给 AngularJS 页面
- java - GridLayout 和 CardView 无法在所有设备上完美运行