Как переопределить createView для сохранения нескольких записей данных
Используя класс CreateView, я хочу сохранить несколько записей данных.
Пример входных данных:
пункт "яблоко, банан, морковь"
местоположение "местоположение 1"
Я хочу сохранить их в базе данных следующим образом:
[яблоко, место 1]
[банан, место 1]
[морковь, место 1]
#model.py
class Inventory(models.Model):
item = models.CharField(max_length=14)
location = models.CharField(max_length=10)
#forms.py
class InventoryCreateForm(forms.ModelForm):
item = forms.CharField(widget=forms.Textarea(attrs={'rows': 8,
'cols': 14}))
class Meta:
model = Inventory
#views.py
class InventoryCreateView(CreateView):
model = Inventory
form_class = InventoryCreateForm
Спасибо
2 ответа
Вам необходимо переопределить метод form_valid(), используемый createview.
Затем вам нужно прочитать в форме данных
def form_valid(self,form):
self.object = form.save(commit=False)
foo = self.object.bar #your data is in the object
Затем, поскольку вы используете текстовое поле, вам нужно как-то разделить данные, передаваемые в форму, и выполнить цикл по этим значениям. В идеале вам понадобится список элементов ['apple', 'banana', 'pear'], затем выведите местоположение из списка и сохраните его в переменной, которую можно использовать позже в location_variable.
Когда у вас есть данные в нужной форме, вам нужно создать экземпляр модели Inventory.
from foo.models import Inventory #import at the top of your file
for item is list:
inventory = Inventory()
inventory.item = item
inventory.location = location_variable
inventory.save()
Я надеюсь, что этот ответ поможет вам в некотором роде, если вы хотите получить более подробную информацию о представлении на основе классов, посетите ccbv, где приведена вся информация для каждого представления.
В противном случае вы можете посмотреть в django Form docs более подходящую форму для использования.
надеюсь, это поможет всем, кто заходит на эту страницу.
Вот что я сделал:
class TrainingBulkCreateForm(ModelForm):
# todo: could we make the original user object a multiple choice field instead?
extra_user = forms.ModelMultipleChoiceField(queryset=User.objects.filter(is_active=True), required=True)
class Meta(object):
model = Training
fields = '__all__'
def post(self, request, *args, **kwargs):
result = super().post(request, *args, **kwargs)
users = request.POST.getlist('extra_user')
if users:
# modify request.POST data then re-save the additional users
for user in users:
# Need to copy the data because the initial QueryDict is immutable data
postdata_copy = request.POST.copy()
postdata_copy['user'] = user
form2 = TrainingBulkCreateForm(postdata_copy)
form2.save()
return result
У меня есть свое поле (моеuser
) разделен на два поля формы - исходноеitem
который является 1 объектом, как .
Тогда у меня также есть второе поле формы. Это требует нескольких объектов, таких как[banana, carrots]
В представлении я вызываюsuper().post(...)
для сохранения исходного объекта. Затем я проверяю поле, чтобы увидеть, есть ли несколько продуктов. Если есть лишнее, копирую неизменяемый объект QueryDictrequest.POST
как . Затем я изменяюpostdata_copy
поэтому вместо того, чтобы заменить на .(Это в основном просто дублирует форму в новую копию сbanana
и повторно сохраняет форму). Затем мы снова зацикливаем и заменяемapple
сcarrots
.
Обратите внимание, что мой объект формы используетModelMultipleChoiceField
дляextra_user
объект. Это обеспечивает лучшую целостность данных, чем ввод необработанного текста.