首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用inlineformset更改ForeignKey值?

如何使用inlineformset更改ForeignKey值?
EN

Stack Overflow用户
提问于 2018-03-20 18:30:15
回答 1查看 33关注 0票数 0

我有两种模型和形式,由ForeignKey‘小队’链接。在我的模板中,我让用户先输入name名称,然后再输入枪手。我正试图用我的ShooterSquad的“ShooterSquad”来硬编码我的射击者的“小队”字段,这样用户就不必每次都为每个枪手键入班名。

models.py

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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)

输入表格样本

我的cleaned_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

EN

回答 1

Stack Overflow用户

发布于 2018-03-27 20:50:34

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

代码语言:javascript
复制
    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') 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49391726

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档