Django inlineformset保存新父级和子级

2024-04-25 21:44:21 发布

您现在位置:Python中文网/ 问答频道 /正文

目标是创建一个网页,允许人们拍照并提交有关图片的元数据。因为同一元数据可以有多张图片,所以我将模型设置为:

你知道吗型号.py

from django.db import models

class MetaData(models.Model):
    description = models.CharField(max_length=5000)

class Image(models.Model):
    image = models.ImageField()
    metadata_id = models.ForeignKey(
        MetaData, on_delete=models.DO_NOTHING, related_name='image_to_metadata'
    )

使用这些模型创建了简单的表单:

你知道吗表单.py

from django.forms import ModelForm
from django.forms.models import inlineformset_factory
from .models import MetaData, Image

class MetaDataForm(ModelForm):
    class Meta:
        model = MetaData
        fields = '__all__'

class ImageForm(ModelForm):
    class Meta:
        model = Image
        fields = ('image',)

MetaDataImageFormSet = inlineformset_factory(MetaData, Image, fields=('image',), extra=1)

然后使用下面的视图显示它们,并根据下面的指南进行身份验证Django inline formsets with class based views

你知道吗视图.py

from django.views.generic import CreateView
from django.db import transaction

from .forms import MetaDataForm, MetaDataImageFormSet
from .models import MetaData

class CaptureView(CreateView):
    model = MetaData
    template_name = 'pages/capture.html'
    form_class = MetaDataForm
    success_url = '/'

    def get_context_data(self, **kwargs):
        data = super(CaptureView, self).get_context_data(**kwargs)
        if self.request.POST:
            data['images'] = MetaDataFormSet(self.request.POST)
        else:
            data['images'] = MetaDataFormSet()
        return data

    def form_valid(self, form):
        context = self.get_context_data()
        images = context['images']
        with transaction.atomic():
            self.object = form.save()
            if images.is_valid():
                images.instance = self.object
                images.save()
        return super(CaptureView, self).form_valid(form)

你知道吗网址.py

from django.urls import path

urlpatterns = [
    path("", CaptureView.as_view(), name="capture"),
]
#  Hiding django toolbar paths and error page handling

当我试图发布一个图像时,我得到以下错误消息

File "C:\Users\dbutler\capture_version_2\lib\site-packages\django\db\backends\utils.py" in _execute 85. return self.cursor.execute(sql, params)

The above exception (null value in column "id" violates not-null constraint DETAIL: Failing row contains (null, test1). ) was the direct cause of the following exception:

File "C:\Users\dbutler\capture_version_2\lib\site-packages\django\core\handlers\exception.py" in inner 34. response = get_response(request)

File "C:\Users\dbutler\capture_version_2\lib\site-packages\django\core\handlers\base.py" in _get_response 126. response = self.process_exception_by_middleware(e, request)

File "C:\Users\dbutler\capture_version_2\lib\site-packages\django\core\handlers\base.py" in _get_response 124. response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "C:\Users\dbutler\AppData\Local\Programs\Python\Python37-32\lib\contextlib.py" in inner 74. return func(*args, **kwds)

File "C:\Users\dbutler\capture_version_2\lib\site-packages\django\views\generic\base.py" in view 68. return self.dispatch(request, *args, **kwargs)

File "C:\Users\dbutler\capture_version_2\lib\site-packages\django\views\generic\base.py" in dispatch 88. return handler(request, *args, **kwargs)

File "C:\Users\dbutler\capture_version_2\lib\site-packages\django\views\generic\edit.py" in post 172. return super().post(request, *args, **kwargs)

File "C:\Users\dbutler\capture_version_2\lib\site-packages\django\views\generic\edit.py" in post 142. return self.form_valid(form)

File "C:\code\capture_version_2\receipts\views.py" in form_valid 27. self.object = form.save()

File "C:\Users\dbutler\capture_version_2\lib\site-packages\django\forms\models.py" in save 458. self.instance.save()

File "C:\Users\dbutler\capture_version_2\lib\site-packages\django\db\models\base.py" in save 718. force_update=force_update, update_fields=update_fields)

File "C:\Users\dbutler\capture_version_2\lib\site-packages\django\db\models\base.py" in save_base 748. updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)

File "C:\Users\dbutler\capture_version_2\lib\site-packages\django\db\models\base.py" in _save_table 831. result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)

File "C:\Users\dbutler\capture_version_2\lib\site-packages\django\db\models\base.py" in _do_insert 869. using=using, raw=raw)

File "C:\Users\dbutler\capture_version_2\lib\site-packages\django\db\models\manager.py" in manager_method 82. return getattr(self.get_queryset(), name)(*args, **kwargs)

File "C:\Users\dbutler\capture_version_2\lib\site-packages\django\db\models\query.py" in _insert 1136. return query.get_compiler(using=using).execute_sql(return_id)

File "C:\Users\dbutler\capture_version_2\lib\site-packages\django\db\models\sql\compiler.py" in execute_sql 1289. cursor.execute(sql, params)

File "C:\Users\dbutler\capture_version_2\lib\site-packages\debug_toolbar\panels\sql\tracking.py" in execute 186. return self._record(self.cursor.execute, sql, params)

File "C:\Users\dbutler\capture_version_2\lib\site-packages\debug_toolbar\panels\sql\tracking.py" in _record 124. return method(sql, params)

File "C:\Users\dbutler\capture_version_2\lib\site-packages\django\db\backends\utils.py" in execute 100. return super().execute(sql, params)

File "C:\Users\dbutler\capture_version_2\lib\site-packages\django\db\backends\utils.py" in execute 68. return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)

File "C:\Users\dbutler\capture_version_2\lib\site-packages\django\db\backends\utils.py" in _execute_with_wrappers 77. return executor(sql, params, many, context)

File "C:\Users\dbutler\capture_version_2\lib\site-packages\django\db\backends\utils.py" in _execute 85. return self.cursor.execute(sql, params)

File "C:\Users\dbutler\capture_version_2\lib\site-packages\django\db\utils.py" in exit 89. raise dj_exc_value.with_traceback(traceback) from exc_value

File "C:\Users\dbutler\capture_version_2\lib\site-packages\django\db\backends\utils.py" in _execute 85. return self.cursor.execute(sql, params)

Exception Type: IntegrityError at / Exception Value: null value in column "id" violates not-null constraint DETAIL: Failing row contains (null, test1).


Tags: djangoinpyselfexecutereturnversionmodels