0

我有一个模型,如果他们是特定组的一部分,我需要附加到用户的附加信息。我已经构建了一个简单的 CreateView 来测试这个工作。不幸的是,它没有将所有信息保存在第二个模型中。这是我第一次使用 Betterforms,我遵循了文档。但是,看起来我错过了一些东西。这是我当前的代码:

表格.py:

# Operator Creation Form
class OperatorProfileForm(forms.ModelForm):
    class Meta:
        model = OperatorProfile
        fields = ('cdl', 'endorsement', 'cdl_expiration')


class UserCreationMultiForm(MultiModelForm):
    form_classes = {
        'user': UserCreationForm,
        'profile': OperatorProfileForm,
    }

    # Save the user first, because the profile needs a user before it
    # can be saved.
    def save(self, commit=True):
        objects = super(UserCreationMultiForm, self).save(commit=False)

        if commit:
            user = objects['user']
            user.save()
            profile = objects['profile']
            profile.user = user
            profile.save()

        return objects

视图.py:

class IndexView(TemplateView):
    template_name = 'pages/index.html'


class OperatorCreateView(CreateView):
    model = OperatorProfile
    template_name = 'pages/operatorprofile_form.html'
    form_class = UserCreationMultiForm
    success_url = reverse_lazy('index')

模型.py:

class CDL(models.Model):
    cdl_type = models.CharField(max_length=10)
    description = models.TextField(max_length=255, blank=True)

    def __str__(self):
        return self.cdl_type


class Endorsement(models.Model):
    endorsement_type = models.CharField(max_length=10)
    description = models.TextField(max_length=255, blank=True)

    def __str__(self):
        return self.endorsement_type


class OperatorProfile(models.Model):
    user = models.ForeignKey('auth.User', on_delete=models.CASCADE)
    cdl = models.ManyToManyField('CDL')
    endorsement = models.ManyToManyField('Endorsement')
    cdl_expiration = models.DateField(default=timezone.now)

    def __str__(self):
        return str(self.user)

目前它没有在 OperatorProfile 模型中保存 ForeignKeys,但其他设置保存得很好。任何投入将不胜感激。

4

1 回答 1

0

嗯……我是个白痴。我忘记了 save_m2m()。这是想知道的人的解决方案。

表格.py:

# Operator Creation Form
class OperatorProfileForm(forms.ModelForm):
    class Meta:
        model = OperatorProfile
        fields = ('cdl', 'endorsement', 'cdl_expiration')


class UserCreationMultiForm(MultiModelForm):
    form_classes = {
        'user': UserCreationForm,
        'profile': OperatorProfileForm,
    }

视图.py:

class IndexView(TemplateView):
    template_name = 'pages/index.html'


class OperatorCreateView(CreateView):
    model = OperatorProfile
    template_name = 'pages/operatorprofile_form.html'
    form_class = UserCreationMultiForm
    success_url = reverse_lazy('index')

    def form_valid(self, form):
        # Save the user first, because the profile needs a user before it
        # can be saved.
        user = form['user'].save()
        profile = form['profile'].save(commit=False)
        profile.user = user
        profile.save()
        form['profile'].save_m2m()
        return redirect(reverse_lazy('index'))
于 2017-05-22T18:29:00.900 回答