Django 自动生成表单中的用户特定数据

Django 自动生成表单中的用户特定数据,django,django-forms,django-templates,Django,Django Forms,Django Templates,我的代码非常简单明了。这些是我的表格 class LearningObjectiveForm( ModelForm ): class Meta: model = LearningObjective fields = ( 'learning_objective', 'topic', ) class LearningObjectiveView( LoginRequiredMixin, FormView ): form_class = LearningObjectiveFor

我的代码非常简单明了。这些是我的表格

class LearningObjectiveForm( ModelForm ):
  class Meta:
    model = LearningObjective
    fields = ( 'learning_objective', 'topic', )
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 )
这是我的模板的一个片段

<form method="POST" action=".">
{% csrf_token %}
<table>
{{ form }}
</table>
<input type="submit" value="Speichern"/>
</form>
以及我的视图

class LearningObjectiveForm( ModelForm ):
  class Meta:
    model = LearningObjective
    fields = ( 'learning_objective', 'topic', )
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 )

主题应针对学员。我是否必须在模板中编写自己的表单,或者是否有这样一种方法使我仍然可以自动生成它?

您可以在表单初始化函数中修改的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)

除了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\u form\u 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', )

它现在可以正常工作,但是如果有多余或不必要的内容,请告诉我:)

注意,
培训生
也不是
用户
的外键。那么您如何将培训生链接到用户?你怎么知道请求用户是哪位学员?好的,是的,这种方法会给你带来很多麻烦。看看扩展用户模型。您无法判断哪个受训者正在使用此方法的应用程序。您需要使用request参数调用表单,否则此时最好传入request.user对象。这里有一个例子,好吧,所以你使用的是CBV,它与之不同(你没有发布任何显示这一点的内容)。。。搜索如何在CBV中获取请求,您必须重写get\u form\u类方法