Параметры ModelChoiceField, не учитываемые при рендеринге HTML - PullRequest
0 голосов
/ 21 марта 2020

В настоящее время я работаю над приложением, и у меня возникла проблема с моей ModelForm.

Мне кажется, что параметры, введенные в ModelChoiceField, не принимаются во внимание.

Это это мои формы.py:

class PlayerModelChoiceField(forms.ModelChoiceField):
    def label_from_instance(self, obj):
        return '{} from {} at {} '.format(obj.name, obj.team, obj.price)


class Form(forms.ModelForm):
    def __init__(self, contest_id, *args, **kwargs):
        super(Form, self).__init__(*args, **kwargs)
        contest = ContestLOL.objects.filter(id=contest_id)[0]
        teams = contest.teams.all()
        players = Player.objects.filter(team__in=teams).order_by('-price')

        self.fields['top'].queryset = players.filter(role='Top')
        self.fields['jungle'].queryset = players.filter(role='Jungle')
        self.fields['mid'].queryset = players.filter(role='Mid')
        self.fields['adc'].queryset = players.filter(role='ADC')
        self.fields['support'].queryset = players.filter(role='Support')

        self.fields['top'].initial = players.filter(role='Top')[0]
        self.fields['jungle'].initial = players.filter(role='Jungle')[0]
        self.fields['mid'].initial = players.filter(role='Mid')[0]
        self.fields['adc'].initial = players.filter(role='ADC')[0]
        self.fields['support'].initial = players.filter(role='Support')[0]

    class Meta:
        model = Model
        fields = {'top': PlayerModelChoiceField(
                                    queryset=Player.objects.filter(role='Top'), 
                                    widget=forms.RadioSelect(), 
                                    empty_label=None, 
                                    to_field_name="top"),
                  'jungle': PlayerModelChoiceField(
                                    queryset=Player.objects.filter(role='Jungle'), 
                                    widget=forms.RadioSelect(), 
                                    empty_label=None, 
                                    to_field_name="jungle"),
                  'mid': PlayerModelChoiceField(
                                    queryset=Player.objects.filter(role='Mid'), 
                                    widget=forms.RadioSelect(), 
                                    empty_label=None, 
                                    to_field_name="mid"),
                   'adc': PlayerModelChoiceField(
                                    queryset=Player.objects.filter(role='ADC'), 
                                    widget=forms.RadioSelect(), 
                                    empty_label=None, 
                                    to_field_name="adc"),
                   'support': PlayerModelChoiceField(
                                    queryset=Player.objects.filter(role='Support'), 
                                    widget=forms.RadioSelect(), 
                                    empty_label=None, 
                                    to_field_name="supp")
        }
        fields = {'top', 'jungle', 'mid', 'adc', 'support'}

Это мои view.py:

def contest(request, slug=None):
    contest = get_object_or_404(ContestLOL, slug=slug)
    matches= Match.objects.filter(contest=contest.id)
    form = Form(contest.id, request.POST or None)
    if form.is_valid():
        bet = form.save(commit=False)
        bet.user = request.user
        bet.contest = contest
        bet.save()
        messages.success(request, 'Bet was saved')
        form = Form(contest.id)

    output = { "contest": contest,
                "form": form,
                "matches": matches
                }
    return render(request, "questions/contest.html", output)

И это соревнование. html:

<form method="post">
  {% csrf_token %}
    Top : 
    <br>
    {{form.top}}
    <hr>

    Jungle : 
    <br>
    {{form.jungle}}
    <hr>

    Mid : 
    <br>
    {{form.mid}}
    <hr>

    ADC : 
    <br>
    {{form.adc}}

    <hr>


    Support : 
    <br>
    {{form.support}}
    <hr>

    <input class="btn btn-success" type="submit" value='Submit'>
</form>

И скриншот того, что я получаю:

[enter image description here][1]

https://i.stack.imgur.com/0dOaC.png

Как вы можете видеть, RadioSelectWidget отсутствует, а метка все еще пуста. Это заставляет меня думать, что опции ModelChoiceField не работают. У кого-нибудь был такой же случай раньше.

1 Ответ

1 голос
/ 21 марта 2020

Хорошо, вы определяете fields дважды в вашем Meta, следовательно, будет сохраняться только последний . Но даже если вы используете словарь, который вы используете, то это , а не способ определения полей. Вы определяете поля, которые формируют уровень класса, так:

class Form(forms.ModelForm):
    <b>top</b> = PlayerModelChoiceField(
        queryset=Player.objects.filter(role='Top'), 
        widget=forms.RadioSelect(), 
        empty_label=None, 
        to_field_name='top'
    )
    <b>jungle</b> = PlayerModelChoiceField(
        queryset=Player.objects.filter(role='Jungle'), 
        widget=forms.RadioSelect(), 
        empty_label=None, 
        to_field_name='jungle'
    )
    <b>mid</b> = PlayerModelChoiceField(
        queryset=Player.objects.filter(role='Mid'), 
        widget=forms.RadioSelect(), 
        empty_label=None, 
        to_field_name='mid'
    )
    <b>adc</b> = PlayerModelChoiceField(
        queryset=Player.objects.filter(role='ADC'), 
        widget=forms.RadioSelect(), 
        empty_label=None, 
        to_field_name='adc'
    )
    <b>support</b> = PlayerModelChoiceField(
        queryset=Player.objects.filter(role='Support'), 
        widget=forms.RadioSelect(), 
        empty_label=None, 
        to_field_name='supp'
    )

    def __init__(self, contest_id, *args, **kwargs):
        super(Form, self).__init__(*args, **kwargs)
        self.fields['top'].initial = players.filter(role='Top')[0]
        self.fields['jungle'].initial = players.filter(role='Jungle')[0]
        self.fields['mid'].initial = players.filter(role='Mid')[0]
        self.fields['adc'].initial = players.filter(role='ADC')[0]
        self.fields['support'].initial = players.filter(role='Support')[0]

    class Meta:
        model = Model
        fields = ('top', 'jungle', 'mid', 'adc', 'support')
...