首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将参数传递给QueryDicts,并将其连续传递给django表单以便在其中使用

如何将参数传递给QueryDicts,并将其连续传递给django表单以便在其中使用
EN

Stack Overflow用户
提问于 2021-01-07 00:10:35
回答 1查看 41关注 0票数 0

描述:我正在使用表单来为那些通过使用ModelForm类成功地完成确定的练习的用户填写Completed_Exercise模型实例,但是由于Completed_ExerciseForm有三个字段,其中两个字段对应于ForeignKey字段,所以我不需要在模板上呈现它们,而是用分数1(非常搞笑的用户可以进行自我限定),所以我决定通过一个request.GET副本将这两个字段作为参数传递给ModelForm实例。

我在谷歌上搜索了一个小时,尝试并修正了一些东西.但即使如此,我也犯了同样的错误,据我所知,这同样可以通过把它们传递给形体,但这不是我想要的方式。任何帮助都是非常感谢的。

结果:i无法从表单内部访问QueryDict

模型:

代码语言:javascript
复制
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

视图:

代码语言:javascript
复制
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)

表格:

代码语言:javascript
复制
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']

这就是我所犯的错误

我想这已经足够回答了,如果不是这样的话,请告诉我。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-07 00:43:43

使用ModelForm,您可以提供initial关键字参数,该参数是要加载表单的键和值的字段名的切分。我也不会像那样覆盖save()

所以在你的例子中,用这些值来定义那些FK字段,你会做一些类似的事情;

代码语言:javascript
复制
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')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65604992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档