如何在 URL 上设置外键并在 django CreateView 上使用它

How to get the Foreign Key set on the URL and use it on django CreateView

感谢您的宝贵时间...

如果有人可以帮助我获取 URL 上显示的外键并在 Django CreateView 上使用它。

我正在尝试创建一个简单的应用程序来组织立法。为此,我在我的数据库中有这样的关系:Categoria 有很多 Series 和 Series 有很多 posts.

我把urls.py的一条路径做了这样

(...)
path('nova-serie/<categoria>', NovaSerie.as_view(), name='nova_serie'), 
(...)

我只想通过从URL获取值并保存为外键,而无需用户再次输入。

view.py

class NovaCategoria(CreateView):
    model = Categoria
    form_class = CategoriaForm
    template_name = 'nova_categoria.html'
    success_url = reverse_lazy('home')

class NovaSerie(CreateView):
    model = Serie
    form_class = SerieForm
    template_name = 'nova_serie.html'
    success_url = reverse_lazy('home')

models.py

class Categoria(models.Model):
    categoria = models.CharField(
        max_length=200, verbose_name="Nome da categoria", help_text="colocar aqui o texto de ajuda")
   
    class Meta:
        verbose_name_plural = "Categorias"
        verbose_name = "categoria"

    def __str__(self):
        return self.categoria

class Serie(models.Model):
    serie = models.CharField(
        max_length=200, verbose_name="Série", help_text="colocar aqui o texto de ajuda")
    categoria = models.ForeignKey(Categoria, default=1, on_delete=models.SET_DEFAULT)
    
    class Meta:
        verbose_name_plural = "serie"

    def __str__(self):
        return self.serie

forms.py

class SerieForm(forms.ModelForm):
    class Meta:
        model = Serie
        fields = (
            'serie',
            'categoria',
        )
        widgets = {
            'title': forms.TextInput(),  # attrs={class="title"}
            'categoria': forms.TextInput(attrs={'class': "green", 'value': object }),  # attrs={class="title"}
        }

class CategoriaForm(forms.ModelForm):
    class Meta:
        model = Categoria
        fields = (
            'categoria',
        )
        widgets = {
            'title': forms.TextInput(),  # attrs={class="title"}
        }

如果您发现此 post 有任何问题,请告诉我。我很乐意更改它。

谢谢。

要做到这一点,我们基本上需要做两件事:

  1. url.py 我们需要告诉 Django 它是一个整数
  2. 在 views.py 使用 form_valid

url.py

所以你的 urls.py 应该是这样的:

path('nova-serie/<int:categoria>', NovaSerie.as_view(), name='nova_serie'),

views.py

class NovaSerie(CreateView):
    model = Serie
    form_class = SerieForm
    template_name = 'nova_serie.html'
    success_url = reverse_lazy('home')

    def form_valid(self, form):
        form.instance.categoria_id = self.kwargs['categoria']
        return super().form_valid(form)

通过这些更改,我能够实现它!

我是新手,如果我要编辑或删除这个post,请告诉我

解决方案由先生给出。 @Willem Van Onsem

我会很高兴buy you a coffee