0

我不断收到“选择一个有效的选择。'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 %}
4

1 回答 1

0

所以我更改了玩家字段的小部件,而不是覆盖表单的整个字段。这是我更新的 forms.py 解决了这个错误

class TeamForm(forms.ModelForm):
    class Meta:
        model = Team
        fields = [
            'name', 'game', 'players'
        ]
        widgets = {
            'players': autocomplete.ModelSelect2Multiple(url='profile-autocomplete',
                                                        attrs={
                                                            'data-placeholder': 'Select Team Members',
                                                            'data-minimum-input-length': 4,
                                                            })
            }
    
    def __init__(self, *args, **kwargs):
        super(TeamForm, self).__init__(*args, **kwargs)
        self.fields['game'].queryset = Game.objects.filter(is_team_game=True)

一旦我为它分配了一个查询集,我就会得到之前生成的错误。

于 2021-07-26T05:53:01.357 回答