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()
...
您好,我正在使用 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()
...