Django:将字符串参数传递给基于类的视图不起作用

Posted

技术标签:

【中文标题】Django:将字符串参数传递给基于类的视图不起作用【英文标题】:Django: Passing string parameters to class-based view not working 【发布时间】:2016-07-28 12:32:19 【问题描述】:

我尝试按照this suggestion 将字符串参数传递给基于类的视图,但它似乎不起作用。

网址:

url(r'^chart/(?P<chart_name>\w+)/$',
        ChartView.as_view(chart_name='chart_name'), name="chart_url"),

观点:

class ChartView(View):
    template_name = "chart.html"
    chart_name = None

    def post(self, request, *args, **kwargs):
        form = DatesForm(request.POST)
        context = 
            'form': form
        
        return render(request, self.template_name, context)

    def get(self, request, *args, **kwargs):
        print("test")
        form = DatesForm()
        # fetch plot data (default values used)
        context = 
            'form': form,
            'chart_name': self.chart_name
        
        return render(request, self.template_name, context)

应该重定向到视图的链接:

<a href="% url 'chartboard:chart_url' chart_name='lords' %">Sometext</a>

(项目 urlconf 中给出的命名空间“chartboard”)。

错误:

NoReverseMatch at /chart/lords/
Reverse for 'chart_url' with arguments '()' and keyword arguments '' not found. 1 pattern(s) tried: ['chart/(?P<chart_name>\\w+)/$']

不管怎样,“test”会被打印两次到控制台输出(为什么?)

在 Ubuntu 14.04.04 上使用 django 1.8.11 和 python 3.4.3

【问题讨论】:

回溯是否显示导致错误的行?我不认为这是您发布的链接,因为 chart_name='lords' 与错误消息不匹配。 @Alasdair 是的,你是对的!我在模板的另一个地方使用这个没有参数的 url,因此出现了特定的错误 您解决了这个问题吗?如果没有,请发布失败的行。 现在好了。这是失败的行:&lt;form action="% url 'chartboard:chart_url' %" method="post" class="form-inline"&gt;% csrf_token %。它现在已被替换为:&lt;form action="% url 'chartboard:chart_url' chart_name=chart_name %" method="post" class="form-inline"&gt;% csrf_token % 【参考方案1】:

您应该使用kwargs 访问chart_name

# urls.py
url(r'^chart/(?P<chart_name>\w+)/$',
    ChartView.as_view(), name="chart_url"),

# and then in the view

class ChartView(View):
    template_name = "chart.html"

    def get(self, request, *args, **kwargs):
        form = DatesForm()
        context = 
            'form': form,
            'chart_name': kwargs['chart_name'] # here you access the chart_name
        
        return render(request, self.template_name, context)

您考虑实现这一点的帖子是为了确保一个变量在模板中可用,并通过在传递给模板渲染的context 中设置它来处理。

您在这里面临的问题是访问在 url 模式中定义的 named group

这里有更多documentation 在您尝试访问 URL 时如何处理请求。

【讨论】:

以上是关于Django:将字符串参数传递给基于类的视图不起作用的主要内容,如果未能解决你的问题,请参考以下文章

如何正确地将参数传递给基于类的视图测试 Django Rest Framework?

当我将可选参数传递给视图时,为啥我的 CSS 静态文件在 Django 中不起作用?

如何使用 HTMX 和 Django 将参数传递给视图?

如何将视图输入参数传递给 @State 变量?

django url如何使用问号? (基于类的视图)

将参数传递给 Django 中的 ListView