我不断收到“选择一个有效的选择。'X' 不是可用的选择之一。” 其中'X'是我在填写团队名称,选择游戏和团队成员后提交创建团队表单时配置文件的主键。
我一直在尝试为与 Profile 模型具有 ManyToMany 关系的模型创建一个表单。在尝试了 django-select2 包后,我决定使用 django-autocomplete-light。
到目前为止,这是我的代码
模型.py
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
dob = models.DateField(unique=False, null=True, blank=True)
class Game(models.Model):
name = models.CharField(max_length=128, unique=True)
is_team_game = models.BooleanField(default=False)
def __str__(self):
return '{}'.format(self.name)
class Team(models.Model):
name = models.CharField(max_length=100)
game = models.ForeignKey(Game, on_delete=models.CASCADE)
players = models.ManyToManyField(Profile, related_name='player_profiles')
视图.py
class ProfileAutocomplete(autocomplete.Select2QuerySetView):
def get_queryset(self):
qs = Profile.objects.all()
if self.q:
qs = qs.filter(user__username__istartswith=self.q)
return qs
网址.py
from django.urls import path
from . import views
urlpatterns = [
path('autocomplete/profile/', views.ProfileAutocomplete.as_view(), name='profile-autocomplete'),
]
表格.py
from django import forms
from .models import Game, Profile, Team
from dal import autocomplete
class TeamForm(autocomplete.FutureModelForm):
players = forms.ModelMultipleChoiceField(label='Team Members',
queryset=Profile.objects.none(),
widget=autocomplete.ModelSelect2Multiple(url='profile-autocomplete'))
class Meta:
model = Team
fields = [
'name', 'game', 'players'
]
def __init__(self, *args, **kwargs):
super(TeamForm, self).__init__(*args, **kwargs)
self.fields['game'].queryset = Game.objects.filter(is_team_game=True)
create_team.html模板
{% extends "website/base.html" %}
{% load crispy_forms_tags %}
{% block head %}
{{ block.super }}
{{ form.media }}
{% endblock head %}
{% block content %}
<div class="content-section">
{% include "website/helper_nav.html" %}
<form method="POST">
{% csrf_token %}
<fieldset class="form-group">
<legend class="border-bottom mb-4">Create Team</legend>
{{ form|crispy }}
</fieldset>
<div class="form-group">
<button class="btn btn-outline-info" type="submit">CREATE</button>
</div>
</form>
</div>
{% endblock content %}