3 Stimmen

Kombinieren von Querysets auf einem Auswahlfeld in Django

Ich habe das folgende Formular:

class FeaturedVideoForm(ModelForm):

    featured_video = forms.ModelChoiceField(Video.objects.none()
                                        widget=make_select_default,
                                        required=False,  
                                        empty_label='No Featured Video Selected')
    class Meta:
        model = UserProfile
        fields = ('featured_video',)

    def __init__(self, userprofile, *args, **kwargs):
        videos_uploaded_by_user=list(userprofile.video_set.all())
        credits_from_others=[video.video for video in userprofile.videocredit_set.all()]
        all_credited_videos=list(set(videos_uploaded_by_user+credits_from_others))
        super(FeaturedVideoForm, self).__init__(*args, **kwargs)
        self.fields['featured_video'].choices = all_credited_videos

Ich habe eine Druckanweisung nach der letzten Zeile des Konstruktors verwendet, um sicherzustellen, dass die korrekte Liste der Videos zurückgegeben wird, und das tut sie auch. Allerdings habe ich Schwierigkeiten, die Liste in der Vorlage anzuzeigen.

Ich habe es versucht:

{% for video in form.featured_video.choices %}
<option value="{{video}}">{{video}}</option>
{% endfor %}

die eine leere Menge von Auswahlmöglichkeiten zurückgibt.

Und ich habe es versucht:

{{form.featured_video}}

das gibt mir TemplateSyntaxError at /profile/edit/featured_video/. Caught TypeError while rendering: 'Video' object is not iterable.

Wie würde ich dieses Select-Formular korrekt darstellen? Ich danke Ihnen.

3voto

David542 Punkte 100780

Choices muss eine Liste von Tupeln sein:

def __init__(self, userprofile, *args, **kwargs):
    ### define all videos the user has been in ###
    videos_uploaded_by_user=list(userprofile.video_set.all())
    credits_from_others=[video.video for video in userprofile.videocredit_set.all()]
    all_credited_videos=list(set(videos_uploaded_by_user+credits_from_others))

    ### build a sorted list of tuples (CHOICES) with title, id
    CHOICES=[]
    for video in all_credited_videos:
        CHOICES.append((video.id,video.title))
    CHOICES.sort(key=lambda x: x[1])

    ### 'super' the function to define the choices for the 'featured_video' field
    super(FeaturedVideoForm, self).__init__(*args, **kwargs)
    self.fields['featured_video'].choices = CHOICES

Und zur Anzeige in der Vorlage:

{{form.featured_video}}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X