Как переопределить 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объект. Это обеспечивает лучшую целостность данных, чем ввод необработанного текста.

Другие вопросы по тегам