Django视图 - 在queryset中排除?

时间:2016-02-02 21:57:58

标签: python django

我有一个问题: 创建新世界后,(所有国家/地区都自动分配到每个新世界)用户选择一个将在网站顶部显示的国家/地区,但他无法删除此国家/地区。怎么做?

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

现在我有了这个:在创建世界用户重定向到new_my_world之后,他应该选择他的国家并被重定向到具有my_world视图的网站,在那里他可以删除期望这个的countires。这该怎么做? views.py

def new_my_world(request, pk):
    world = get_object_or_404(World, pk=pk)
    return render(request, 'game/new_my_world.html', {'world': world})

def my_world(request, pk):
    world = get_object_or_404(World.objects.exclude(??, pk=pk)
    return render(request, 'game/my_world.html', {'world': world})

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

我知道在my_world视图中应该有排除的东西(不包括这个国家),但我不知道如何连接它。

修改

URL:

  url(r'^world/(?P<pk>[%&+ \w]+)/(?P<country_pk>[%&+ \w]+)/$', views.my_world, name='my_world'),

EDIT2:

如何为my_world创建网址?创建新世界后,当我点击第一个国家选择它时,我收到错误

使用此网址:

url(r'^world/(?P<pk>[%&+ \w]+)/(?P<country_pk>[%&+ \w]+)/$', views.my_world, name='my_world'),

Page not found (404)
Request Method:     GET
Request URL:    http://127.0.0.1:8000/world/22/9/
Raised by:  game.views.my_world

No World matches the given query.

1 个答案:

答案 0 :(得分:1)

我将choose_country修复为以下内容:

def choose_country(request, world_pk, country_pk):
    world = get_object_or_404(World, pk=world_pk)
    country = get_object_or_404(Country, pk=country_pk)
    return redirect('my_world', pk=world.pk, country_pk = country.id)

然后在你的my_world函数中,它应该像这样改变:

def my_world(request, pk, country_pk):
    world = get_object_or_404(World.objects.exclude(country__id = country_pk), pk=pk)
    return render(request, 'game/my_world.html', {'world': world})

修改1 如果国家与我的世界国家相同,则上述get_object_or_404(World.objects.exclude(country__id = country_pk), pk=pk)肯定会返回Not Found。所以我建议my_world如下:

def my_world(request, pk, country_pk):
        world = get_object_or_404(World, pk=pk)
        countries = get_object_or_404(Country.object.exclude(pk=country_pk))
        return render(request, 'game/my_world.html', {'world': world, 'countries': countries})