Django视图,如何更改删除对象

时间:2016-01-24 15:43:42

标签: 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

现在,当我创造出几个国家的世界时,我有这样的观点:

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

和html文件:

{% for country in world.country.all %}
        <a href="{% url 'game.views.delete_country' pk=country.pk %}">{{ country.name }}</a>
{% endfor %}

删除视图:

def delete_country(request, pk):
    country = get_object_or_404(Country, pk=pk)
    country.delete()
    return render(request, 'game/my_world.html', {'world': world})

URL:

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

这就是我发明的一切

现在我在my_world国家/地区列表中,当我点击其中一个时,它会被删除。我想改变它:

  1. 如何改变它从选择的世界中删除国家,但仅限于这个世界?
  2. 此后如何自动返回此my_world?(可能是主键但当前选项不起作用)

1 个答案:

答案 0 :(得分:3)

如果您不想完全删除国家/地区,只是将其从特定世界中删除,那么您需要某种方式来识别您的意思是哪个世界。您可能需要在URL中执行此操作:

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

您可以在模板中链接到它:

{% url 'game.views.delete_country' world_pk=world.pk, country_pk=country.pk %}

现在,视图可以获取世界并删除其特定国家/地区。请注意,第二个问题的答案是使用redirect快捷方式:

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)

另请注意,通过简单链接触发删除操作是一个非常糟糕的主意。通常,任何修改数据库的操作 - 尤其是删除某些操作的操作 - 都应该通过表单发布。