全局名称'pk'未定义django。

3
你好,我有一个类似于主题标题的问题。
我有世界细节 - 在这里我有这个世界中国家的列表。我想仅从此世界中删除一个国家,而不是普遍地删除它,并在此之后自动返回到此世界。
查看我的世界:
def my_world(request, pk):
    world = get_object_or_404(World, pk=pk)
    return render(request, 'game/my_world.html', {'world': world})

def delete_country(request, world_pk, country_pk):
    world = get_object_or_404(World, pk=pk)
    country = get_object_or_404(Country, pk=pk)
    world.country.remove(country)
    return redirect("my_world", pk=world.pk)

错误提示说是关于第几行。
world = get_object_or_404(World, pk=pk)

在模板中
{% url 'game.views.delete_country' world_pk=world.pk country_pk=country.pk %}

url.py

url(r'^world/(?P<world_pk>\d+)/(?P<country_pk>\d+)/$', views.delete_country, name='delete_country'),

models.py

class Country(models.Model):
    name = models.CharField(verbose_name="Name of country", max_length=100, default="Australia")
    number = models.IntegerField(verbose_name="number of country", default="1")

    def __unicode__(self):
        return self.name

class World(models.Model):
    country = models.ManyToManyField(Country)
    name = models.CharField(verbose_name="New Map", max_length=100)

    def __unicode__(self):
        return self.name

如何修复这个错误?
编辑:
在/world/31/12/处发生了NoReverseMatch错误。
引用:
找不到符合参数'()'和关键字参数'{ 'pk': 31}'的'my_world'的反向匹配。尝试了0个模式:[]。
return redirect("my_world", pk=world.pk)

你不需要 get_object_or_404(World, pk=world_pk) 吗?例如在第二个视图中,你没有传递名为 pk 的参数。 - Tom Dalton
2个回答

5
当然,错误再明显不过了,在你的函数delete_country中,你没有将pk作为参数,但你却这样做了:
def delete_country(request, world_pk, country_pk):
    world = get_object_or_404(World, pk=pk)

也许你尝试执行 world = get_object_or_404(World, pk=world_pk)

编辑::

你使用了错误的方式返回redirect. redirect 期望一个可以进行重定向的URL,但是你给它的是一个函数名。如果你的my_world函数也有一个名为my_world的URL名称,则应使用reverse从中派生URL:

from django.core.urlresolvers import reverse

def delete_country(request, world_pk, country_pk):
    world = get_object_or_404(World, pk=pk)
    country = get_object_or_404(Country, pk=pk)
    world.country.remove(country)
    return redirect(reverse('my_world', args=(world.pk,)))

请查看重定向文档反向解析文档。 这可能/可能不会立即让人感到有意义,但如果没有,试着放慢速度阅读/搜索一些示例。


1
同样地,在下一行中使用country = get_object_or_404(Country, pk=country_pk) - Alasdair
谢谢,解决方案很简单,确实...但是现在当我删除后重定向到世界站点时,我得到了这个错误:编辑:NoReverseMatch at /world/31/12/
Reverse for 'my_world' with arguments '()' and keyword arguments '{'pk': 31}' not found. 0 pattern(s) tried: []
return redirect("my_world", pk=world.pk) 我认为这与URL有关,但我不知道如何更改它,我尝试从URL中删除(?P\d+),但不起作用。
- znawca
谢谢!现在我明白这个错误只是因为我打错了一个字母,但我会使用你的解决方案,我认为它更好,并且我会学到一些新东西。 - znawca

2

出现错误是因为没有名为pk的变量。这些方法在url中被调用。只有world_pkcountry_pk被定义了。

请使用world = get_object_or_404(World, pk=world_pk)

或者world = get_object_or_404(World, pk=country_pk)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接