Django在url中基于slug生成外键关系

2024-04-29 20:17:49 发布

您现在位置:Python中文网/ 问答频道 /正文

首先,英语不是我的第一语言,Django也不是

假设我有一个模型“城市”,它与一个“”有父键/外键关系(每个省可以有多个城市)

models.py:

class Province(models.Model):
    name = models.CharField(max_length=75, help_text="What province are you adding?", unique=True, default="")
    slug = models.SlugField(max_length=100, blank=True)

class City(models.Model):
    province = models.ForeignKey(Province, on_delete=models.CASCADE) #Each city belongs to one province
    slug = models.SlugField(max_length=100, blank=True)

可以通过CreateView将城市添加到省

My related views.py如下所示:

class AddCityView(CreateView):
    model = City
    form_class = CityForm
    def get_success_url(self):
        return reverse('app:provincedetail', kwargs={'slug' : self.object.province.slug})

相关的url.py如下所示:

urlpatterns = [
    path('<slug:slug>/', views.ProvinceDetailView.as_view(), name='provincedetail'), #shows province information in more detail
    path('<slug:province>/add/', views.AddCityView.as_view(), name='addcity'), #add a city to a province
]

因此,当用户转到“省详细信息”视图时,他们可以很容易地通过表单从那里添加一个城市。我认为在这个表单中为省设置一个字段是多余的,它应该在用户提交城市表单时自动生成。在我看来,这将通过url完成,因为省slug已经在其中。最好的方法是什么

我的想法是在提交表单后通过覆盖CreateView的form_valid函数来更改字段值,如下所示:

def form_valid(self, form):
    self.object = form.save()
    self.province = #but then how would I pass the slug in the url to this? How do I even get the url in a CreateView function?
    return super().form_valid(form)

但是,我不确定如何在views.py中获取当前url数据并将相关部分(slug)传递给self.province。我该怎么做?我知道您可以在模板视图中使用{{request.path},但我认为这在这里不适用

任何帮助都是值得的,谢谢


Tags: namepyselfformtrueurl表单models
1条回答
网友
1楼 · 发布于 2024-04-29 20:17:49

首先,您应该使slug唯一,然后在您的视图中,您可以通过self.kwargs访问slug:

from django.http import HttpResponseRedirect
from django.shortcuts import get_object_or_404


class AddCityView(CreateView):
    model = City
    form_class = CityForm

    def form_valid(self, form):
       city = form.save(commit=False)
       city.province = get_object_or_404(Province, slug=self.kwargs['province'])
       city.save()
       self.object = city
       return HttpResponseRedirect(self.get_success_url())

相关问题 更多 >