Skip to main content
 首页 » 编程设计

python之Django View之在查询集中排除

2025年05月04日34cmt

我有一个问题: 创建新世界后,(所有国家自动分配给每个新世界)用户选择一个国家将显示在网站顶部,他不能删除这个国家。如何做到这一点?

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 View 的站点,在那里他可以删除这个国家。这个怎么做? View .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 View 中应该有一些排除(不包括这个 coosen 国家)但我不知道如何连接它。

编辑

网址:

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

编辑2:

如何创建 my_world 的 url?创建新世界后,当我点击第一个国家选择它时出现错误

使用此网址:

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. 

请您参考如下方法:

我将 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})