Django 提交表单后为ForeignKey字段添加pk
在我通过表单提交数据后,我正在尝试更改/添加ForeignKey字段的主键。 表单不要求外键,这应该通过Slug完成:Django 提交表单后为ForeignKey字段添加pk,django,django-models,django-views,Django,Django Models,Django Views,在我通过表单提交数据后,我正在尝试更改/添加ForeignKey字段的主键。 表单不要求外键,这应该通过Slug完成: Model.py class Verantwortlicher(models.Model): masznahme = models.ForeignKey(Masznahmen, verbose_name='Maßnahme') verantwortlicher = models.CharField('Verantwortlicher Mitarbeiter',
Model.py
class Verantwortlicher(models.Model):
masznahme = models.ForeignKey(Masznahmen, verbose_name='Maßnahme')
verantwortlicher = models.CharField('Verantwortlicher Mitarbeiter',
max_length=30)
faelligkeit = models.DateField('Fälligkeit')
def __str__(self):
return self.verantwortlicher
forms.py
class VerantwortlicherForm(forms.ModelForm):
masznahme = forms.ModelChoiceField(queryset=Masznahmen.objects.all() ,
label='Maßnahme',
required=False,
)
def __init__(self, *args, **kwargs):
super(VerantwortlicherForm, self).__init__(*args, **kwargs)
self.helper = FormHelper()
self.helper.form_id = 'id-Verantwortlicher'
self.helper.form_class = 'form-horizontal'
self.helper.label_class = 'col-md-3'
self.helper.field_class = 'col-md-4'
self.helper.form_method = 'post'
#self.helper.form_action = 'verantwortlicher'
self.helper.layout = Layout(
Fieldset(
'',
'verantwortlicher',
'faelligkeit',
),
FormActions(
Submit('submit', 'Datensatz hinzufügen', css_class="button white")
)
)
class Meta:
model = Verantwortlicher
View.py
def verantwortlicher(request, slug):
context = RequestContext(request)
if request.method == "POST":
form = VerantwortlicherForm(request.POST)
if form.is_valid():
form.save(commit=False)
masznahme = Masznahmen.objects.get(slug=slug)
form.masznahme = masznahme.pk
form.save(commit=True)
return redirect('aktionsplan')
else:
print(form.errors)
else:
form = VerantwortlicherForm()
return render_to_response('verbrauchererfassung/verantwortlicher.html',
{'form': form},
context,
)
作为回报,我得到一个valueError:
异常类型:ValueError
异常值:
无法分配None:“Verantwortlicher.masznahme”不允许空值
我的推理错误在哪里?我想你应该这样做:
vwortlicher = form.save(commit=False)
masznahme = Masznahmen.objects.get(slug=slug)
vwortlicher.masznahme = masznahme.pk
vwortlicher.save()
讨论完聊天后:
从完整的堆栈跟踪中,我们发现实际错误位于if form.is\u valid()
行中。罪魁祸首碰巧在forms.py中表单类的Meta中缺少
exclude
。表单验证需要来自
masznahme
field小部件的输入,但该小部件不在那里很抱歉这么晚才回复-我仍然收到相同的ValueError。调试信息仍然有“none”作为masznahmeWell的输入,那么,您确定适当的masznahme
对象确实存在吗?原因此异常基本上表示您正在尝试为Verantwortlicher模型的masznahme字段分配空值,这是禁止的。还有,这个异常到底是在哪里引发的?你能通过跟踪吗?我很确定我曾经提到过m是m来自masznahmenthen的站点安装它:sudo pip install ipdb
(假设你在linux上),然后粘贴如下内容:import ipdb;ipdb.set_trace()
belowe行,在该行中检查表单验证(在视图中),然后运行开发服务器(或重新启动它-以防万一),当代码执行到达视图文件中的这一行时,它将停止并提示您获取说明。然后,您将能够逐行调试代码-在提示符中,您可以使用基本的python语法(AFAIK,我实际上主要使用打印和比较)例如打印变量的值。然后您可以通过键入next
(或n
)转到下一行