【问题标题】:How to fix missing 1 required positional argument 'request' error?如何修复缺少 1 个必需的位置参数“请求”错误?
【发布时间】:2021-06-09 11:10:05
【问题描述】:

/risk/riskset 处的类型错误 get_context_data() 缺少 1 个必需的位置参数:“请求”。

在此处查看代码: 模型.py

class RiskSet(models.Model):
    name = models.CharField('Risk set', max_length=500, blank=True, default = '')
    owner = models.ForeignKey(User, verbose_name = 'owner', on_delete=models.PROTECT, null=True)
    risk = models.ForeignKey(Risk, verbose_name = 'risk', on_delete=models.PROTECT, null = True)
    parent_risk_set = models.ForeignKey('self', related_name="child_risk_set", on_delete=models.PROTECT, blank=True, null=True)
  
    def __str__(self):
        return "{}".format(self.name)

forms.py

class RiskSetForm(forms.ModelForm):
    RiskID1 = forms.ModelMultipleChoiceField(queryset=Risk.objects.all(), required=True,
                                             widget=forms.SelectMultiple(attrs={'class': 'select2'}),
                                             label = 'Risk id')
                                                         
    def __init__(self, *args, **kwargs):
        super(RiskSetForm, self).__init__(*args, **kwargs)
        print(self)
        for visible in self.visible_fields():
            visible.field.widget.attrs['class'] = 'form-control'

    class Meta:
        model = RiskSet
        fields = ['name', 'owner', 'risk', 'parent_risk_set']

views.py

class RiskSet(FormView, SingleTableMixin):
    template_name = "risk/RiskSet.html"
    model = RiskSet
    form_class = RiskSetForm
    def get_context_data(self, request):
        form = RiskSetForm(request.POST or None)
        if form.is_valid():
            form.save()    
        # Call the base implementation first to get a context
        context = super().get_context_data(**kwargs)
        # Add in a QuerySet of all the books
        context['page'] = 'risk'
        return context

现在我得到了错误:

/risk/riskset 处的类型错误 get_context_data() 缺少 1 个必需的位置参数:'request'

请帮忙!

【问题讨论】:

  • 尝试添加这个get_context_data(self,*args, **kwargs)
  • 你为什么处理get_context_data中的表格??这应该已经在视图类的form_valid 方法中完成了......

标签: python django


【解决方案1】:

get_context_data request 参数一起工作。你可以传递任意数量的参数,但这里你的get_context_data 只会在被请求调用时运行。您使用self.request 访问请求:

class RiskSet(SingleTableMixin, FormView):
    template_name = "risk/RiskSet.html"
    model = RiskSet
    form_class = RiskSetForm
    
    def get_context_data(self, *args, **kwargs):
        form = RiskSetForm(self.request.POST or None)
        if form.is_valid():
            form.save()    
        # Call the base implementation first to get a context
        context = super().get_context_data(*args, **kwargs)
        # Add in a QuerySet of all the books
        context['page'] = 'risk'
        return context

此外,在get_context_data 方法中这样做是没有意义的。 FormView 有为此制定的例程。它您可能还可以使用CreateView,它将删除更多样板代码,例如:

from django.views.generic import CreateView

class RiskSet(SingleTableMixin, CreateView):
    template_name = "risk/RiskSet.html"
    model = RiskSet
    form_class = RiskSetForm
    success_url = 'path-to-url-when-form-is-valid'
    
    def get_context_data(self, *args, **kwargs):
        context = super().get_context_data(*args, **kwargs)
        # Add in a QuerySet of all the books
        context['page'] = 'risk'
        return context

【讨论】:

  • 感谢您对威廉的评论。当我尝试您的第一段代码时,我收到以下错误:未指定表数据。定义 RiskSet.table_data
  • @maxie112:正如错误所说,您需要通过添加一个额外的属性来实现SingleTableMixin(与指定table_dataform_class处于同一级别。跨度>
猜你喜欢
  • 1970-01-01
  • 2020-05-13
  • 2018-05-31
  • 1970-01-01
  • 2021-08-12
  • 2018-01-24
  • 2020-05-07
  • 2018-12-12
  • 1970-01-01
相关资源
最近更新 更多