2015-03-02 23 views
1

我的代碼非常簡單直接。這些都是我形式自動生成表格中的用戶特定數據

class LearningObjectiveForm(ModelForm): 
    class Meta: 
    model = LearningObjective 
    fields = ('learning_objective', 'topic',) 

這是一個片段從我模板

<form method="POST" action="."> 
{% csrf_token %} 
<table> 
{{ form }} 
</table> 
<input type="submit" value="Speichern"/> 
</form> 

這種形式使得現在能對每個用戶的每一個主題的訪問。由於此字段通常有用戶限制,因此我不希望每個主題都顯示出來,而只是某個用戶的主題。在我模式對於這種特殊情況下的結構是這樣的

class Trainee(models.Model): 
    user = models.OneToOneField(User) 
    first_name = models.TextField() 
    last_name = models.TextField() 
    education_beginning = models.DateField() 
    comment = models.TextField(null = True, blank = True) 

class Topic(models.Model): 
    trainee = models.ForeignKey(Trainee) 
    topic = models.TextField() 

class LearningObjective(models.Model): 
    trainee = models.ForeignKey(Trainee) 
    topic = models.ManyToManyField(Topic, blank = True, null = True) 
    learning_objective = models.TextField() 

而且我意見

class LearningObjectiveView(LoginRequiredMixin, FormView): 
    form_class = LearningObjectiveForm(user = request.user) 
    success_url = reverse_lazy('learning_objective') 
    template_name = 'learningobjective.html' 

    def get_context_data(self, **kwargs): 
    trainee = Trainee.objects.get(user = self.request.user) 
    context = super(LearningObjectiveView, self).get_context_data(**kwargs) 
    context['learningobjective'] = LearningObjective.objects.filter(trainee = trainee.id) 
    context['topic'] = Topic.objects.filter(trainee = trainee.id) 
    return context 

    def form_valid(self, form): 
    self.object = form.save(commit = False) 
    if self.request.user.is_authenticated(): 
     self.object.trainee = Trainee.objects.get(user = self.request.user) 
    self.object.save() 
    return super(LearningObjectiveView, self).form_valid(form) 

的主題應該是見習具體。我是否必須在模板中編寫自己的表單,或者是否有這樣的方式,以便我仍然可以自動生成它?

回答

1

您可以修改init函數形式的ModelChoiceField的queryset屬性,這將限制選擇並正確驗證。

的形式將類似於下面的代碼

class LearningObjectiveForm(ModelForm): 
    class Meta: 
    model = LearningObjective 
    fields = ('learning_objective', 'topic',) 

    def __init__(self, user, *args, **kwargs): 
    super(LearningObjectiveForm,self).__init__(*args,**kwargs) 
    self.fields['topic'].queryset = Topic.objects.filter(trainee=user) 

然後在表格請確保調用的形式LearningObjectiveForm(user=request.user)

+0

注意'trainee'是_not_的外鍵'User'無論是。 – Selcuk 2015-03-02 13:58:05

+0

然後你如何將學員鏈接到用戶?你如何知道請求用戶是哪位受訓者? – awwester 2015-03-02 14:20:24

+1

好吧,這種方法會讓你陷入很多麻煩。看看擴展用戶模型。 https://docs.djangoproject.com/en/1.7/topics/auth/customizing/#extending-the-existing-user-model 你不能告訴哪個學員使用這種方法的應用程序。 – awwester 2015-03-02 14:25:55

0

除了awwester的回答我說這個我用戶視圖

class LearningObjectiveView(LoginRequiredMixin, FormView): 
    form_class = LearningObjectiveForm 
    template_name = 'learningobjective.html' 
    success_url = reverse_lazy('learning_objective') 

    def get_context_data(self, **kwargs): 
     trainee = Trainee.objects.get(user = self.request.user) 
     context = super(LearningObjectiveView, self).get_context_data(**kwargs) 
     context['learningobjective'] = LearningObjective.objects.filter(trainee = trainee.id) 
     context['topic'] = Topic.objects.filter(trainee = trainee.id) 
     return context 

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

    def form_valid(self, form): 
     self.object = form.save(commit = False) 
     if self.request.user.is_authenticated(): 
      self.object.trainee = Trainee.objects.get(user = self.request.user) 
     self.object.save() 
     return super(LearningObjectiveView, self).form_valid(form) 

get_form_kwargs傳遞與當前用戶的用戶kwarg 表格。 後來我終於形式是這樣的:

class LearningObjectiveForm(ModelForm): 
    def __init__(self, user, *args, **kwargs): 
     trainee = Trainee.objects.get(user = user) 
     super(LearningObjectiveForm, self).__init__(*args, **kwargs) 
     self.fields['topic'].queryset = Topic.objects.filter(trainee = trainee.id) 

    class Meta: 
     model = LearningObjective 
     fields = ('learning_objective', 'topic',) 

現在工作得很好,但是如果事情是多餘的或不必要的請告訴我:)