目标是创建一个网页,允许人们拍照并提交有关图片的元数据。因为同一元数据可以有多张图片,所以我将模型设置为:
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'
)
使用这些模型创建了简单的表单:
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
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)
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).
目前没有回答
相关问题 更多 >
编程相关推荐