自动生成表格中的用户特定数据
User specific data in automatic generated forms
我的代码非常简单明了。这些是我的表格
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>
此表单现在使每个用户都可以访问每个主题。由于此字段通常有用户限制,我不希望显示每个主题,而只显示特定用户的主题。在我的 models 中,这个特定案例的结构看起来像这样
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 )
主题应该针对学员。我是否必须在模板中编写自己的表单,或者是否有这样的方式让我仍然可以自动生成它?
您可以在表单初始化函数中修改 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)
除了 awwester 的回答之外,我还把这个添加到我的 view
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', )
现在工作正常,但如果有多余或不必要的地方请告诉我:)
我的代码非常简单明了。这些是我的表格
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>
此表单现在使每个用户都可以访问每个主题。由于此字段通常有用户限制,我不希望显示每个主题,而只显示特定用户的主题。在我的 models 中,这个特定案例的结构看起来像这样
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 )
主题应该针对学员。我是否必须在模板中编写自己的表单,或者是否有这样的方式让我仍然可以自动生成它?
您可以在表单初始化函数中修改 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)
除了 awwester 的回答之外,我还把这个添加到我的 view
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', )
现在工作正常,但如果有多余或不必要的地方请告诉我:)