如何使用inlineformset更改ForeignKey值?

时间:2018-03-20 18:30:15

标签: python django

我有两个由ForeignKey'小队联系的模特和表格。在我的模板中,我让用户先键入Squad名称,然后输入射手。我正在努力对“小队”进行硬编码。我的射击游戏领域有' squad_name'我的ShooterSquad,所以用户不必每次为每个射击者输入小队名称。

models.py

class ShooterSquad(models.Model):
    squad_name = models.CharField(unique=True, max_length=100)
    school = models.CharField(max_length=100, null=False)

    def __str__(self):
        return self.squad_name

class Shooter(models.Model):
    name = models.CharField(max_length=100)
    squad = models.ForeignKey(ShooterSquad, to_field='squad_name', related_name='squad', on_delete=models.PROTECT)

    def __str__(self):
        return self.name

forms.py

class ShooterSquadForm(forms.ModelForm):
class Meta:
    model = ShooterSquad
    fields = ['squad_name', 'squad_total_score', ]

class ShooterForm(forms.ModelForm):
    class Meta:
        model = Shooter
        fields = '__all__'

class BaseShooterFormSet(BaseModelFormSet):
def __init__(self, *args, **kwargs):
    super(BaseShooterFormSet, self).__init__(*args, **kwargs)
    self.queryset = Shooter.objects.none()

ShooterFormSet = inlineformset_factory(
    ShooterSquad, Shooter,
    form=ShooterForm,
    formset=BaseShooterFormSet,
    extra=1,
    max_num=3,
    exclude=('squad',)
)

views.py

def add_multiple_shooters(request):
if request.method == 'POST':
    squad_form = ShooterSquadForm(request.POST)
    formset = ShooterFormSet(request.POST)
    if squad_form.is_valid() and formset.is_valid():
        set_squad = squad_form.cleaned_data.get('squad_name')
        for f in formset.forms:
            f.cleaned_data['squad_id'] = set_squad
            f.cleaned_data['squad'] = set_squad
            print(formset.cleaned_data)
        squad_form.save()
        formset.save()
        return redirect('anasp:mainpage')
else:
    print("ERROR")
    formset = ShooterFormSet()
    squad_form = ShooterSquadForm()
context = {
    "title": title,
    "formset": formset,
    "squad_form": squad_form,
}
return render(request, "anasp/scores/shooter_formset.html", context)

Input Form Sample

我的cleaning_data打印:[{'shooter_number': 67, 'squad': 'Woodland', 'name': 'Legolas', 'DELETE': False, 'id': None, 'shooter_score': 39, 'squad_id': 'Woodland'}]

所以看来squad_id已经改变了吗?错误。当我查看我的数据库时,我的squad_id是<null> 我该如何解决这个问题?

Python:3.5.4 Django:1.8

1 个答案:

答案 0 :(得分:0)

我通过在进行所有更改之前不提交保存来修复它:

    if squad_form.is_valid():
        squad = squad_form.save(commit=False)

        if formset.is_valid():
            shooters_to_save = list()

            for f in formset.forms:
                shooter = f.save(commit=False)
                shooter.squad = squad
                shooters_to_save.append(shooter)

            squad.save()

            for shooter in shooters_to_save:
                shooter.save()
            return redirect('anasp:mainpage')