Django 提交表单后为ForeignKey字段添加pk

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',

在我通过表单提交数据后,我正在尝试更改/添加ForeignKey字段的主键。 表单不要求外键,这应该通过Slug完成:

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
)转到下一行