【问题标题】:Django got an unexpected keyword argumentDjango 得到了一个意外的关键字参数
【发布时间】:2021-09-05 22:44:40
【问题描述】:

我正在尝试创建一个存档,因此我将参数年和月传递给视图。

但是,下面的代码出现错误,我无法弄清楚它的含义以及如何解决它:

Exception Type: TypeError
Exception Value:    archive() got an unexpected keyword argument 'year_id'
Exception Location: /usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py in get_response, line 115

有什么问题?

views.py

    # loop over years and months
def mkmonth_lst():
    if not Post.objects.count():
        return []
    # set up vars
    year, month = time.localtime()[:2]
    first = Post.objects.order_by("created")[0]
    fyear = first.created.year
    fmonth = first.created.month
    months = []

    # loop over years and months
    for y in range(year, fyear-1, -1):
        start, end = 12, 0
        if y == year: start = month
        if y == fyear: end = fmonth-1

        for m in range(start, end, -1):
            months.append((y, m, month_name[m]))

    return months

def archive(request, year, month):
    posts = Post.objects.filter(created__year=year, created__month=month)
    context = {'PostList': posts, 'Months': mkmonth_lst()}

    return(render, 'archives.html', context)

urls.py

url(r'^archives/(?P<year_id>\d+)/(?P<month_id>\d+)$', views.archive, name='archives'),

更新:

models.py

class Post(models.Model):
    title = models.CharField(max_length=100)
    body = models.TextField()
    created = models.DateTimeField(auto_now_add=True)
    url = models.URLField(null=True, blank=True)
    video = models.FileField(upload_to = 'video', verbose_name = 'Video', null=True, blank=True)
    picture = models.ImageField(upload_to = 'post', verbose_name = 'Picture')
    tags = TaggableManager()

    def __unicode__(self):
        return self.title

模板

<h3>Archivo</h3>
  <p>
    {% for month in months %}
        {% ifchanged month.0 %} {{ month.0 }} <br /> {% endifchanged %}
            <a href="/blog/archives/{{month.0}}/{{month.1}}">{{ month.2 }}</a> <br />
    {% endfor %}
  </p>

更新 2:错误

usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py in get_response
            response = middleware_method(request, response) ...
/usr/local/lib/python2.7/dist-packages/django/middleware/common.py in process_response
    if response.status_code == 404: ...


Request Method: GET
Request URL:    http://127.0.0.1:8000/blog/archives/2014/1
Django Version: 1.5
Exception Type: AttributeError
Exception Value:    
'tuple' object has no attribute 'status_code'
Exception Location: /usr/local/lib/python2.7/dist-packages/django/middleware/common.py   in process_response, line 106
Python Executable:  /usr/bin/python
Python Version: 2.7.3
Python Path:    
['/home/fernando/develop/blogmanage',
'/usr/local/lib/python2.7/dist-packages/django_mptt-0.6.0-py2.7.egg',
'/usr/local/lib/python2.7/dist-packages',
'/usr/lib/python2.7',
'/usr/lib/python2.7/plat-linux2',
'/usr/lib/python2.7/lib-tk',
'/usr/lib/python2.7/lib-old',
'/usr/lib/python2.7/lib-dynload',
'/usr/local/lib/python2.7/dist-packages',
'/usr/lib/python2.7/dist-packages',
'/usr/lib/python2.7/dist-packages/PIL',
'/usr/lib/python2.7/dist-packages/gst-0.10',
'/usr/lib/python2.7/dist-packages/gtk-2.0',
'/usr/lib/pymodules/python2.7',
'/usr/lib/python2.7/dist-packages/ubuntu-sso-client',
'/usr/lib/python2.7/dist-packages/ubuntuone-client',
'/usr/lib/python2.7/dist-packages/ubuntuone-control-panel',
'/usr/lib/python2.7/dist-packages/ubuntuone-couch',
'/usr/lib/python2.7/dist-packages/ubuntuone-installer',
'/usr/lib/python2.7/dist-packages/ubuntuone-storage-protocol']
Server time:    Wed, 29 Jan 2014 21:09:56 +0100

【问题讨论】:

  • URL 捕获变量“year_id”,但您的视图采用参数“year”。
  • 没错!现在我收到一个新错误。

标签: python django


【解决方案1】:

您的参数名称有问题:

 def archive(request, year, month):

yearmonth 替换为year_idmonth_id,它应该可以工作。

编辑:

对于您的第二个错误,相应于this question,您的archive() 视图不会返回正确的响应。

这是您的代码,已修复:

from django.shortcuts import render_to_response

def archive(request, year_id, month_id):
    posts = Post.objects.filter(created__year=year_id, created__month=month_id)
    context = {'PostList': posts, 'Months': mkmonth_lst()}

    # the error was here
    return render_to_response('archives.html', context)

编辑 2:

您的模板无法遍历 months,因为上下文中不存在 var:

context = {'PostList': posts, 'Months': mkmonth_lst()} # Not correct
context = {'postList': posts, 'months': mkmonth_lst()} # Correct

你看出区别了吗?您在第一个变量名称中使用大写字母(“Months”),而渲染的模板(区分大小写)查找小写变量(“months”)。

【讨论】:

  • 没错!现在的错误是:'tuple' 对象没有属性'status_code'
  • 请粘贴整个堆栈跟踪和/或它发生的代码 =)
  • 感谢您解决了我的问题,但现在网络浏览器不显示模板完整,只加载其中的一部分。
  • 我认为错误位于mkmonth_lst()。但是,我不了解您使用此功能的目标,所以我无能为力,抱歉 =/
  • 我的目标是创建一个存档。我遵循这个教程lightbird.net/dbe/blog2.html,但我无法将存档视图适应我的博客应用程序。
【解决方案2】:

在我的例子中,在模型定义中使用 : 而不是 = 是一个错字。

例如:

class Workspace(models.Model):
    title: models.CharField(max_length=200)
    description: models.CharField(max_length=2000)
...

但应该是:

class Workspace(models.Model):
    title = models.CharField(max_length=200)
    description = models.CharField(max_length=2000)
...

【讨论】:

    猜你喜欢
    • 2018-05-02
    • 2020-08-18
    • 2019-02-03
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-01
    相关资源
    最近更新 更多