描述:我正在使用表单来为那些通过使用ModelForm类成功地完成确定的练习的用户填写Completed_Exercise模型实例,但是由于Completed_ExerciseForm有三个字段,其中两个字段对应于ForeignKey字段,所以我不需要在模板上呈现它们,而是用分数1(非常搞笑的用户可以进行自我限定),所以我决定通过一个request.GET副本将这两个字段作为参数传递给ModelForm实例。
我在谷歌上搜索了一个小时,尝试并修正了一些东西.但即使如此,我也犯了同样的错误,据我所知,这同样可以通过把它们传递给形体,但这不是我想要的方式。任何帮助都是非常感谢的。
结果:i无法从表单内部访问QueryDict
模型:
class Completed_Exercise(models.Model):
possible_scores = list(zip(range(1,8), range(1,8)))
exercise = models.OneToOneField(Exercise, default=None, on_delete=models.CASCADE)
points = models.IntegerField(default=0, choices=possible_scores)
student = models.ForeignKey('accounts.Student', on_delete = models.CASCADE, related_name='completed_exercises')
def __str__(self):
return self.name
#Student belongs to other django app, despite its placed alongside the first one.
class Student(models.Model):
user = models.OneToOneField(User, null=True, on_delete=models.CASCADE, related_name="student")
pui = models.CharField(max_length=20, blank=True, default='')
grade = models.CharField(max_length=1, blank=True, default='')
score = models.IntegerField(default=0)
reputation = models.IntegerField(default=0)
def __str__(self):
return self.user.username视图:
def exercise_detail_view(request,pk):
form = Completed_ExerciseForm()
exercise = get_object_or_404(Exercise, pk=pk)
if request.method == "GET":
if request.user.is_authenticated:
copy = request.GET.copy()
copy['student'] = request.user.student
copy['exercise'] = get_object_or_404(Exercise, pk=pk)
form = Completed_ExerciseForm(copy)
print(copy)
print('you are registered...glad am i')
else:
return redirect('login')
if request.user.student.completed_exercises.filter(pk=pk).exists():
messages.add_message(request, messages.ERROR, 'You are done with that exercise already')
print('exercise_completed!!!')
return redirect('exercise/' + str(pk))
elif form.is_valid():
form.save()
print('saved the holy form')
return redirect(request.META['HTTP-REFERER'])
context = { 'exercise':exercise, 'form':form }
return render(request, 'training/exercise.html',context=context)表格:
class Completed_ExerciseForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
self.qQ = args[0]
super().__init__(*args, **kwargs)
def save(self, *args, **kwargs):
Completed_Exercise.objects.create(student = self.qQ['student'], exercise = self.qQ['exercise'], points = self.points)
class Meta:
model = Completed_Exercise
fields = ['points']我想这已经足够回答了,如果不是这样的话,请告诉我。
发布于 2021-01-07 00:43:43
使用ModelForm,您可以提供initial关键字参数,该参数是要加载表单的键和值的字段名的切分。我也不会像那样覆盖save()。
所以在你的例子中,用这些值来定义那些FK字段,你会做一些类似的事情;
class Completed_ExerciseForm(forms.ModelForm):
class Meta:
model = Completed_Exercise
fields = [
'points',
'student',
'exercise'
]
widgets = {
'student': forms.HiddenInput(),
'exercise': forms.HiddenInput(),
}
def exercise_detail_view(request,pk):
form = Completed_ExerciseForm()
exercise = get_object_or_404(Exercise, pk=pk)
if request.method == "GET":
if request.user.is_authenticated:
initial = {}
initial['student'] = request.user.student
initial['exercise'] = get_object_or_404(Exercise, pk=pk)
form = Completed_ExerciseForm(initial=initial)
print(initial)
print('you are registered...glad am i')
else:
return redirect('login')https://stackoverflow.com/questions/65604992
复制相似问题