Как передать итеративный набор запросов в поле формы? - PullRequest
0 голосов
/ 07 августа 2020

Мне сложно понять, почему мой QuerySet не повторяется

Я пытаюсь использовать данные пользователей при форматировании формы. Я возвращаю QuerySet с курсами, которые пользователь еще не прошел, а затем передаю его в качестве вариантов для метода multiplechoicefield. Когда я пытаюсь это сделать, я получаю сообщение об ошибке: «TypeError: не удается распаковать не повторяемый объект Courses» Вот мой код:

forms.py

from django import forms
from .models import UserProfile, Courses

class CourseForm(forms.Form):
 
    def __init__(self, *args, **kwargs):
        self.user=kwargs.pop('user', None)
        super(CourseForm, self).__init__(*args, **kwargs)

        student_profile = UserProfile.objects.filter(user_id=self.user)
        crs_taken = Courses.objects.filter(userprofiles=student_profile[0])
        crs_not_taken = Courses.objects.exclude(title=crs_taken[0])    

        self.fields['crs_not_taken'] = forms.MultipleChoiceField(choices=crs_not_taken)

models.py

from django.db import models
from django.contrib.auth import get_user_model
# Create your models here.

class Courses(models.Model):
    subject = models.CharField(max_length=50)
    title = models.CharField(max_length=50)
    professor = models.CharField(max_length=50)
    section = models.PositiveSmallIntegerField()
    crn = models.PositiveSmallIntegerField()
    userprofiles = models.ManyToManyField('UserProfile', through='Attends')

    def __str__(self):
        return self.title

class UserProfile(models.Model):
    usermodel = get_user_model()
    user = models.OneToOneField(usermodel, on_delete=models.CASCADE)
    course = models.ManyToManyField('Courses', through='Attends')

    def __str__(self):
        return "%s's profile" % self.user

#Juction table
class Attends(models.Model):
    userprofile = models.ForeignKey(UserProfile, on_delete=models.CASCADE)
    courses = models.ForeignKey(Courses, on_delete=models.CASCADE)

views.py

from django.shortcuts import render, redirect
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.decorators import login_required
from .models import UserProfile, Courses
from django.http import HttpResponseRedirect
from .forms import CourseForm
from django import forms

# Create your views here.

def indexView(request):
    return render(request, 'index.html')

@login_required
def dashboard_view(request):
    #Retrieves the users profile
    user_id = request.user.id
    student_profile = UserProfile.objects.filter(user_id=user_id)
    
    form = CourseForm(user=request.user)
    
    #queryset with all of the users courses
    query_set = student_profile[0].course.all()
    return render(request, 'dashboard.html', {'query_set':query_set, 'form':form})

Любые советы приветствуются. Спасибо.

...