2015-03-02 58 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',) 

现在工作得很好,但是如果事情是多余的或不必要的请告诉我:)