1

嗨,我正在使用 ModelFieldChoice 在模型“Article”(文章属于 Provider)中设置来自 Provider 的外键。模板中的选择与数据库中的所有提供者一起正确显示,但是当我尝试发布表单时,它会抛出一个错误,即即使我正在传递选择值也是必需的。我还为数据库中的文章设置了值,当我尝试编辑它时,除了选择之外,表单中的所有字段都填充了正确的数据。这些是我的模型,我将不胜感激,谢谢!抱歉,如果我做错了什么,这是我第一次在 stackoverflow 上发帖。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()

视图.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>"(必填字段,好像我没有通过它)

4

1 回答 1

0

首先,将您的ArticleCreate序列化程序简化为:

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

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

Sou 你也可以简化你的视图:

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

于 2020-09-29T12:57:33.657 回答