Как инстанцировать модель с помощью функции init в modelforms?
У меня есть программа, которая загружает данные в формате csv, чтобы сопоставить значения в csv с другими значениями. Для этого пользователь должен выбрать, какие колонки в csv ему нужны для создания сопоставления, чтобы на странице сопоставления не было лишней информации.
Для этого я создал динамический Django, переопределив функцию init в моей ModelForm. Проблема в том, что хотя я могу динамически отображать значения столбцов, когда пользователь пытается выбрать значения и сохранить их в модели, это не удается, потому что выбор модели не совпадает с динамическими значениями флажков. Поэтому я переопределил функцию init модели, чтобы заполнить выбор модели. Моя проблема в том, что я не уверен, как инстанцировать модель в ModelForm, чтобы вызвать функцию init.
модель
class ColumnMapping(models.Model):
CHOICES =[('row_1', 'A'), ('row_2', 'B'), ('row_3', 'C')]
company = models.ForeignKey(RawData, on_delete=models.CASCADE)
columnNames = MultiSelectField(max_length=100, choices=CHOICES)
def __init__(self, *args, **kwargs):
self.choices = kwargs.pop('choices')
super(ColumnMapping, self).__init__(*args, **kwargs)
self._meta.get_field.choices = self.choices
form - я думаю, что здесь должно что-то произойти в классе Meta, но поскольку строка model = ColumnMapping не инстанцирует модель (я не думаю), я не думаю, что могу передавать ей переменные.
class ColumnMappingForm(ModelForm):
def __init__(self, *args, **kwargs):
self.choices = kwargs.pop('choices')
super(ColumnMappingForm, self).__init__(*args, **kwargs)
self.fields['columnNames'].widget.attrs.update({'class': 'form-check'})
self.fields['columnNames'].choices = self.choices
class Meta:
model = ColumnMapping
fields = ('columnNames',)
просмотров
def columnSelection(request, companyName):
companyData = RawData.objects.get(companyName = companyName)
columnNames = list(RawData.objects.get_columnNames(companyData.file.name))
columnNamesTuple = ()
for columnName in columnNames:
tup = (columnName, columnName)
columnNamesTuple = list(columnNamesTuple)
columnNamesTuple.append(tup)
columnNamesTuple = tuple(columnNamesTuple)
if request.method == "POST":
form = ColumnMappingForm(request.POST, choices=columnNamesTuple)
if form.is_valid():
form.save()
return HttpResponseRedirect(reverse("mappingApp:productMapping", kwargs={'companyName': companyData.companyName}))
else:
error = list(form.errors.values())[0]
return render(request, "mappingApp/columnSelection.html", {
"form": form,
"columnNames": columnNames,
"company": companyData,
"error": error
})
else:
form = ColumnMappingForm(choices=columnNamesTuple)
return render(request, "mappingApp/columnSelection.html", {
"form": form,
"columnNames": columnNames,
"company": companyData
})