【问题标题】:How to get the Foreign Key set on the URL and use it on django CreateView如何获取在 URL 上设置的外键并在 django CreateView 上使用它
【发布时间】:2020-12-28 19:24:14
【问题描述】:

感谢您的宝贵时间...

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

我正在尝试创建一个简单的应用程序来组织立法。为此,我的数据库中有这样的关系:类别有很多系列,系列有很多帖子。

我已经把 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"}
        }

如果您发现这篇文章有任何问题,请告诉我。我很乐意改变它。

谢谢。

【问题讨论】:

    标签: python django django-class-based-views django-generic-views


    【解决方案1】:

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

    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)
    

    通过这些更改,我得以实现!

    我是新手,如果我应该编辑或删除这篇文章,请告诉我

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

    我会很高兴buy you a coffee

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-07
      • 2018-11-24
      • 2019-07-06
      • 1970-01-01
      • 2013-07-06
      • 1970-01-01
      • 2012-03-22
      相关资源
      最近更新 更多