2017-05-28 2 views
1

Image displaying issueErste bestimmte Werte in django Form erscheinen

das Bild angehängt zeigt mein aktuelles Problem. Mathe 270 und Mathe 280 auf dem Bild wurden von einem anderen Benutzer erstellt und nicht von Jay, der den Jays-Kurs erstellt hat. Der andere Benutzer ist jedoch gerade angemeldet und nicht Jay. Wie kann ich nur die Kurse aufrufen, die vom eingeloggten Benutzer erstellt wurden, nicht von Jay, um in diesem Dropdown-Menü zu erscheinen?

In meinen Ansichten habe ich im Anschluss an den mit dem Versuch, das Problem zu lösen:

class CreateQuestion(LoginRequiredMixin, CreateView): 
    model = Question 
    fields = ["title", "question", 'classe'] 
    template_name = "attendance_test/add_test.html" 

    def form_valid(self, form): 
     form.instance.instructor = self.request.user 
     return super(CreateQuestion, self).form_valid(form) 

    def get_context_data(self, **kwargs): 
     context = super(CreateQuestion, self).get_context_data(**kwargs) 
     context['classe'] = Classe.objects.filter(professor=self.request.user.id) 
     return context 

    def get_initial(self): 
     return { 'classe': Classe.objects.filter(professor=self.request.user.id) } 

Meine Frage Modell:

class Question(models.Model): 
    title = models.CharField(max_length=100) 
    question = models.TextField(max_length=500) 
    date_pub = models.DateTimeField(auto_now_add=True) 
    instructor = models.ForeignKey(Teacher, on_delete=models.CASCADE, default="") 
    # this is where all the courses are showing up, I only want those 
    # created by the "instructor" to show up, not all instructors 
    classe = models.ForeignKey(Classe, on_delete=models.CASCADE, null=True) 

    def professor_classes(self): 
     return Classe.objects.filter(professor=self.professor) 

Lehrer Modell:

class Teacher(User): 
    isProfessor = models.BooleanField(default=False) 
    professor_courses = models.ForeignKey('Classe', on_delete=models.CASCADE, null=True) 

Dieses Problem wäre ein Problem, wenn es so viel wie 1000 Klassen sagen würde, aber ein Ausbilder dachte nur 4, es würde keinen Sinn ergeben, d Isplay alle 1000, als 996 nichts mit ihnen zu tun hatte. Für die Aufzeichnung habe ich diese Frage schon einmal gestellt, ich bekam eine Antwort, aber ich konnte sie immer noch nicht lösen.

Antwort

1
def get_form(self, form_class): 
     form = super(CreateQuestion, self).get_form(form_class) 
     form.fields['classe']= Classe.objects.filter(professor=self.request.user.id) 
     return form 

Sie viele Möglichkeiten, so etwas wie diese

1

Im moment gibt es dieses Problem zu lösen, je nachdem, wie Sie strukturieren Ihre Django-Anwendung versuchen könnten. Eine Möglichkeit könnte beispielsweise sein:

class QuestionForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     professor = kwargs.pop('professor') 
     super(QuestionForm, self).__init__(*args, **kwargs) 
     self.fields['classe'].queryset = Classe.objects.filter(professor=professor) 

    class Meta: 
     model = Question 
     fields = ('title', 'question', 'classe') 

class CreateQuestionView(LoginRequiredMixin, CreateView): 
    form = QuestionForm 
    template_name = "attendance_test/add_test.html" 

    def get_form_kwargs(self): 
     kwargs = super(CreateQuestionView, self).get_form_kwargs() 
     kwargs['professor'] = self.request.user 
     return kwargs 

    def form_valid(self, form): 
     form.instance.instructor = self.request.user 
     return super(CreateQuestionView, self).form_valid(form) 

Diese Filterklassen basieren auf dem aktuell angemeldeten Benutzer.

Obwohl ich denke, es ist falsch zu erben Teacher Modell von User.

class Teacher(models.Model): 
    user = models.ForeignKey(User) 
    # or 
    #user = models.OneToOneField(User) 

Auch Sie haben Probleme mit Ihrem Code: performante und traditionelle Lösung Aggregation in diesem Fall wäre die Verwendung initial sind ein erster ausgewählter Wert für das Formularfeld, dann ist es erlaubte Werte kein Bereich. Mit der Einstellung initial legen Sie einen initial ausgewählten Wert für das Formularfeld fest.

context ist ein Diktat von Variablen, die an Ihre Vorlage übergeben werden. Also ich glaube, Sie müssen get_context in Ihrer Sicht nicht definieren (oder zumindest muss es keine Liste von Classes übergeben).

+0

Warum übergeben wir eine TeacherEditView? – BigMonkey89WithaLeg

+1

Sorry, @ BigMonkey89WithaLeg, es war mein Fehler. Die Antwort wurde korrigiert. –

+0

Wie fügen Sie ein ModelMultipleChoiceField zu dieser Formularklasse hinzu? – BigMonkey89WithaLeg