Python 使用Django'分配外键;s CreateView
我一整天都在和这件事搏斗。我正试图想出一个解决方案,在每个表单中保存多张图片。我觉得我好像在家里,但我现在的问题是,我不能在提交表单时自动分配ForeignKey。以下代码在各个方面都起作用,但没有FK应用于DB记录。非常感谢您的帮助 正在尝试通过:Python 使用Django'分配外键;s CreateView,python,django,Python,Django,我一整天都在和这件事搏斗。我正试图想出一个解决方案,在每个表单中保存多张图片。我觉得我好像在家里,但我现在的问题是,我不能在提交表单时自动分配ForeignKey。以下代码在各个方面都起作用,但没有FK应用于DB记录。非常感谢您的帮助 正在尝试通过: FA_Attachments.objects.create( image=f,field_evaluations = request.POST.get('order')) 只是给我: Cannot assi
FA_Attachments.objects.create(
image=f,field_evaluations = request.POST.get('order'))
只是给我:
Cannot assign "'test'": "FA_Attachments.field_evaluation" must be a "FieldEvaluation" instance.
型号.py
from django.db import models
class FieldEvaluation(models.Model):
"Our default field evaluation form"
created_at = models.DateTimeField(auto_now_add=True)
order = models.CharField(max_length=50)
class FA_Attachments(models.Model):
field_evaluation = models.ForeignKey(
FieldEvaluation, on_delete=models.CASCADE, null=True)
image = models.ImageField(upload_to='photos')
from django import forms
from .models import FieldEvaluation, FA_Attachments
class FieldEvaluationForm(forms.ModelForm):
class Meta:
model = FieldEvaluation
fields = ['order'] # not attachments!
attachments = forms.ImageField(
widget=forms.ClearableFileInput(attrs={'multiple': True}))
from django.views.generic.edit import CreateView
from django.shortcuts import render
from .forms import *
from .models import *
class FieldEvaluationView(CreateView):
model = FieldEvaluation
form_class = FieldEvaluationForm
template_name = 'QA.html'
success_url = '?success'
def post(self, request, *args, **kwargs):
form_class = self.get_form_class()
form = self.get_form(form_class)
files = request.FILES.getlist('attachments')
if form.is_valid():
for f in files:
FA_Attachments.objects.create(
image=f)
return self.form_valid(form)
else:
return self.form_invalid(form)
Forms.py
from django.db import models
class FieldEvaluation(models.Model):
"Our default field evaluation form"
created_at = models.DateTimeField(auto_now_add=True)
order = models.CharField(max_length=50)
class FA_Attachments(models.Model):
field_evaluation = models.ForeignKey(
FieldEvaluation, on_delete=models.CASCADE, null=True)
image = models.ImageField(upload_to='photos')
from django import forms
from .models import FieldEvaluation, FA_Attachments
class FieldEvaluationForm(forms.ModelForm):
class Meta:
model = FieldEvaluation
fields = ['order'] # not attachments!
attachments = forms.ImageField(
widget=forms.ClearableFileInput(attrs={'multiple': True}))
from django.views.generic.edit import CreateView
from django.shortcuts import render
from .forms import *
from .models import *
class FieldEvaluationView(CreateView):
model = FieldEvaluation
form_class = FieldEvaluationForm
template_name = 'QA.html'
success_url = '?success'
def post(self, request, *args, **kwargs):
form_class = self.get_form_class()
form = self.get_form(form_class)
files = request.FILES.getlist('attachments')
if form.is_valid():
for f in files:
FA_Attachments.objects.create(
image=f)
return self.form_valid(form)
else:
return self.form_invalid(form)
视图.py
from django.db import models
class FieldEvaluation(models.Model):
"Our default field evaluation form"
created_at = models.DateTimeField(auto_now_add=True)
order = models.CharField(max_length=50)
class FA_Attachments(models.Model):
field_evaluation = models.ForeignKey(
FieldEvaluation, on_delete=models.CASCADE, null=True)
image = models.ImageField(upload_to='photos')
from django import forms
from .models import FieldEvaluation, FA_Attachments
class FieldEvaluationForm(forms.ModelForm):
class Meta:
model = FieldEvaluation
fields = ['order'] # not attachments!
attachments = forms.ImageField(
widget=forms.ClearableFileInput(attrs={'multiple': True}))
from django.views.generic.edit import CreateView
from django.shortcuts import render
from .forms import *
from .models import *
class FieldEvaluationView(CreateView):
model = FieldEvaluation
form_class = FieldEvaluationForm
template_name = 'QA.html'
success_url = '?success'
def post(self, request, *args, **kwargs):
form_class = self.get_form_class()
form = self.get_form(form_class)
files = request.FILES.getlist('attachments')
if form.is_valid():
for f in files:
FA_Attachments.objects.create(
image=f)
return self.form_valid(form)
else:
return self.form_invalid(form)
你不能保存外键 首先,我建议您强制执行附件关系:
class FA_Attachments(models.Model):
field_evaluation = models.ForeignKey(
FieldEvaluation, on_delete=models.CASCADE)
image = models.ImageField(upload_to='photos')
我删除了null=True
,因为该模型与FieldEvaluation严格相关
然后你必须修改你的帖子
class FieldEvaluationView(CreateView):
model = FieldEvaluation
form_class = FieldEvaluationForm
template_name = 'QA.html'
success_url = '?success'
def post(self, request, *args, **kwargs):
form_class = self.get_form_class()
form = self.get_form(form_class)
files = request.FILES.getlist('attachments')
# your form must have it!
order = request.POST.get('order')
fe = FieldEvaluation.objects.create(order=order)
if form.is_valid():
for f in files:
# here you create the relation with the FieldEvaluation
FA_Attachments.objects.create(
image=f, field_evaluation=fe)
return self.form_valid(form)
else:
return self.form_invalid(form)
你不能保存外键 首先,我建议您强制执行附件关系:
class FA_Attachments(models.Model):
field_evaluation = models.ForeignKey(
FieldEvaluation, on_delete=models.CASCADE)
image = models.ImageField(upload_to='photos')
我删除了null=True
,因为该模型与FieldEvaluation严格相关
然后你必须修改你的帖子
class FieldEvaluationView(CreateView):
model = FieldEvaluation
form_class = FieldEvaluationForm
template_name = 'QA.html'
success_url = '?success'
def post(self, request, *args, **kwargs):
form_class = self.get_form_class()
form = self.get_form(form_class)
files = request.FILES.getlist('attachments')
# your form must have it!
order = request.POST.get('order')
fe = FieldEvaluation.objects.create(order=order)
if form.is_valid():
for f in files:
# here you create the relation with the FieldEvaluation
FA_Attachments.objects.create(
image=f, field_evaluation=fe)
return self.form_valid(form)
else:
return self.form_invalid(form)
我会选择覆盖
form\u valid
而不是post
方法。在表单\u valid
中,您可以保存字段\u评估对象,然后将此新对象分配给ForeignKey字段。最后调用并返回form\u valid
,form作为参数
class FieldEvaluationView(CreateView):
model = FieldEvaluation
form_class = FieldEvaluationForm
template_name = 'QA.html'
success_url = '?success'
def form_valid(self, form):
field_evaluation_obj = form.save(commit=True)
files = self.request.FILES.getlist('attachments')
for f in files:
FA_Attachments.objects.create(image=f, field_evaluation=field_evaluation_obj)
return super(FieldEvaluationView, self).form_valid(form)
我会选择覆盖
form\u valid
而不是post
方法。在表单\u valid
中,您可以保存字段\u评估对象,然后将此新对象分配给ForeignKey字段。最后调用并返回form\u valid
,form作为参数
class FieldEvaluationView(CreateView):
model = FieldEvaluation
form_class = FieldEvaluationForm
template_name = 'QA.html'
success_url = '?success'
def form_valid(self, form):
field_evaluation_obj = form.save(commit=True)
files = self.request.FILES.getlist('attachments')
for f in files:
FA_Attachments.objects.create(image=f, field_evaluation=field_evaluation_obj)
return super(FieldEvaluationView, self).form_valid(form)
非常感谢。该null=true用于在前面查找另一个bug。好地方。不幸的是,您发布的解决方案给了我:“无法分配”'test':“FA_Attachments.field_evaluation”必须是一个“FieldEvaluation”实例。这就是让我感到困惑的地方。它非常困惑您的模型,但我修复了我的代码,现在它可以工作了。谢谢!该null=true用于在前面查找另一个bug。好地方。不幸的是,您发布的解决方案给了我:“无法分配”'test':“FA_Attachments.field_evaluation”必须是一个“FieldEvaluation”实例。这就是让我感到困惑的地方。它非常混乱您的模型,但我修复了我的代码,现在它可以工作了。对。这是合乎逻辑的,因为您使用此对象将其作为外键。我已经编辑了答案。对。这是合乎逻辑的,因为您使用此对象将其作为外键。我已经编辑了答案。