Django ModelFieldChoice select 传递值

Django ModelFieldChoice select passing value

您好,我正在使用 ModelFieldChoice 在模型“文章”(文章属于提供者)中设置来自提供者的外键。模板中的 select 与数据库中的所有提供程序一起正确显示,但是当我尝试 post 表单时,它会抛出一个错误,即 select 值是必需的,即使我正在通过它。我还为数据库中的文章设置了值,当我尝试对其进行编辑时,表单中的所有字段都填充了正确的数据,select 除外。 这些是我的模型,我将不胜感激,谢谢!抱歉,如果我做错了什么,这是我第一次 post 在 Whosebug 中。 Article.py型号

class Article(models.Model):
     codigo = models.CharField(max_length=100, verbose_name='Codigo')
     proveedor = models.ForeignKey(Provider, on_delete=models.CASCADE)
     descripcion = models.CharField(max_length=200, verbose_name='Descripcion',null=False, blank=True)
     marca = models.CharField(max_length=100, verbose_name='Marca',null=True, blank=True)
     rubro = models.CharField(max_length=100, verbose_name='Rubro',null=True, blank=True)
     nota = models.TextField(verbose_name='Nota',null=True)
     costo = models.CharField(max_length=50, verbose_name='Costo',null=False, blank=True)
     created = models.DateTimeField(auto_now_add=True, verbose_name="Fecha de creación",null=True, blank=True)
     updated = models.DateTimeField(auto_now=True, verbose_name="Fecha de edición",null=True, blank=True)

class Meta:
    verbose_name = "articulo"
    verbose_name_plural = "articulos"
    ordering = ['-descripcion']

def __str__(self):
    return self.descripcion

Provider.py 型号

class Provider(models.Model):
    razon_social = models.CharField(max_length=100, verbose_name='Razón Social', unique=True)
    direccion = models.CharField(max_length=100, verbose_name='Dirección', blank=True, null=True)
    localidad = models.CharField(max_length=100, verbose_name='Localidad', blank=True, null=True)
    provincia = models.CharField(max_length=100, verbose_name='Provincia', blank=True, null=True)
    telefono = models.CharField(max_length=100, verbose_name='Teléfono', blank=True, null=True)
    mail = models.CharField(max_length=100, verbose_name='Email', blank=True, null=True)
    web = models.CharField(max_length=100, verbose_name='Sitio Web', blank=True, null=True)
    created = models.DateTimeField(auto_now_add=True, verbose_name="Fecha de creación", null=True)
    updated = models.DateTimeField(auto_now=True, verbose_name="Fecha de edición", null=True)

    class Meta:
        verbose_name = "proveedor"
        verbose_name_plural = "proveedores"
        ordering = ['-razon_social']

    def __str__(self):
        return self.razon_social

form.py(创建文章)

class ArticleCreate(forms.ModelForm):
    proveedor_id = forms.ModelChoiceField(queryset=Provider.objects.none(), empty_label="Elegir un proveedor")

    class Meta:
        model = Article
        fields = '__all__'

    def __init__(self, *args, **kwargs):
        super(ArticleCreate, self).__init__(*args, **kwargs)
        self.fields['proveedor_id'].queryset = Provider.objects.all()

views.py

def add_article(request):
if request.method == 'POST':
    create = ArticleCreate(request.POST)
    print(request.POST['proveedor_id'])
    if create.is_valid():
        create.save()
        return redirect('/dashboard/articles/?add=success')
    else:
        print(create.errors)
        return redirect('/dashboard/articles/?error=True')
else:
    return render(request, "article/add_edit_article.html",  {'editMode': False,'form': ArticleCreate})

在 views.py 中,当我打印 'proveedor_id' 时,该值在控制台中正确显示,但随后“is_valid()”失败并打印错误 "<ul class="errorlist"><li>proveedor<ul class="errorlist"><li>Este campo es obligatorio.</li></ul></li></ul>"(必填字段,好像我没有通过它)

首先,将您的 ArticleCreate 序列化程序简化为如下所示:

class ArticleCreate(forms.ModelForm):
  class Meta:
    model = Article

然后在请求中传递 proveedor 字段,而不是 proveedor_id。在 Django/DRF 中,您应该使用 "{{association_name}}": id 模式传递关联 ID,而不是 "{{association_name}}_id": id

你也可以简化你的视图:

def add_article(request):
if request.method == 'POST':
  create = ArticleCreate(request.POST)
  if create.is_valid():
    create.save()
  ...