如何在模型中不创建和启动表单选择字段?



我已经在这个论坛和西班牙语中回顾了许多与此主题相关的问题,我已经按照步骤操作,它对我不起作用,起初看起来很简单。我有一个Django 2.2.6的表单,该表单需要 Select 字段的选定值,该字段不在模型中,并获取从视图创建的值列表(两个元组(。

输入表单后,抛出此错误:"__init__((在FotoArtForm类的超级((行中收到了一个意外的关键字参数'carpetas'"。这是我的代码:

models.py

class FotoArt(models.Model):
nombre = models.CharField(max_length=50)
foto = models.ImageField(upload_to='fotos/articulos/', null=True, blank=True)
class Meta:
ordering = ['nombre']
verbose_name = _('Foto Artículo')
verbose_name_plural = _('Fotos Artículos')
def __str__(self):
return self.nombre
def get_absolute_url(self):
return reverse('detalle-fotoArt', args=[str(self.id)])

views.py

class FotoArtActualizar(LoginRequiredMixin, UpdateView):
model = FotoArt
form_class = FotoArtForm 
Ruta = os.path.join(MEDIA_ROOT, 'fotos', 'articulos')
def get_form_kwargs(self):
kwargs = super(FotoArtActualizar, self).get_form_kwargs()
kwargs['carpetas'] = self.get_folders_list(self.Ruta)
return kwargs
def get_folders_list(self, ruta):
foldersList = []
for _, listaSubDir, _ in os.walk(ruta):
for dName in listaSubDir:
foldersList.append((dName, dName))
return foldersList

forms.py

class FotoArtForm(forms.ModelForm):
guardar_en_carpeta = forms.ChoiceField(choices=(), required=True)
def __init__(self, *args, **kwargs):
super(FotoArtForm, self).__init__(*args, **kwargs)
self.foldersList = kwargs.pop('carpetas', None)
self.fields['guardar_en_carpeta'].choices = self.foldersList
class Meta:
model = FotoArt
fields = ['nombre', 'guardar_en_carpeta', 'foto']

fotoArt_form.html

{% extends 'catalogo/base.html' %}
{% block content %}
<h2>Crear/Actualizar Fotos Artículos</h2>
<hr/>
<form action="" method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ form.non_field_errors }}
<div class="input-group mb-3">
<div class="input-group-prepend">
<label class="input-group-text font-weight-bold" for="inputCarpeta">Guardar en carpeta</label>
</div>
{{ form.guardar_en_carpeta.errors }}
{{ form.guardar_en_carpeta }}
</div>
{{ form.foto.errors }}
<strong>{{ form.foto.label_tag }}</strong>
{{ form.foto }}
<div class="form-group row my-2">
<label for="nombreFoto" class="col-sm-2 col-form-label"><strong>Nombre</strong></label>
{{ form.nombre.errors }}
<div class="col-sm-10">
{{ form.nombre }}
</div>
<input type="submit" value="Enviar" />
</div>
</form>
{% endblock %}

知道为什么我会收到此错误吗?

也许,您应该采用另一种方法将文件夹(选项(列表传递给表单的字段save_in_folder;我可以覆盖 get_context_data (( 方法并向其传递上下文 ['folders_list'],而不是覆盖 get_form_kwargs (( 方法,但这样我就无法控制save_in_folder选择器的值以在另一个字段中使用它。

您尚未在FotoArtForm.Meta.fields中定义carpetas字段,但您正在通过表单传递数据,因此来自FotoArtForm初始值设定项的错误carpetas不是有效的命名参数。

您需要反转语句以pop-outcapetas命名参数,以便在没有它的情况下调用ModelForm.__init__

class FotoArtForm(forms.ModelForm):
...
...
def __init__(self, *args, **kwargs):
self.foldersList = kwargs.pop('carpetas', None)
super(FotoArtForm, self).__init__(*args, **kwargs)

最新更新