【问题标题】:PersonalInfo matching query does not existPersonalInfo 匹配查询不存在
【发布时间】:2021-12-10 08:30:34
【问题描述】:

我想在我的表单中添加一个多选字段,经过搜索,我终于让它工作了。但是,当我创建一个新用户并尝试填写个人信息表单时,它给了我 PersonalInfo 匹配查询不存在错误。这些是我的代码: 模型.py:

class Field(models.Model):
    id = models.AutoField(primary_key=True)
    slug = models.CharField(max_length=16, default='default')
    title = CharField(max_length=32)


class PersonalInfo(models.Model):
    id = models.AutoField(primary_key=True)
    isCompleted = models.BooleanField(default=False)
    interested_fields = models.ManyToManyField(Field, blank=True)

forms.py:

class InterestedFieldsForm(forms.ModelForm):
    interested_fields = forms.ModelMultipleChoiceField(widget=forms.CheckboxSelectMultiple, queryset=Field.objects.all(), required=False)

    class Meta:
        model = PersonalInfo
        fields = ['interested_fields']

views.py:

class PersonalView(View):
    template_name = 'reg/personal.html'

    def get(self, request, *args, **kwargs):
        context = {}
        context['fields'] = Field.objects.all()
        return render(request, self.template_name, context=context)

    def post(self, request, *args, **kwargs):
        user = request.user
        if request.method == 'POST':
            form = InterestedFieldsForm(request.POST, instance=PersonalInfo.objects.get(user=user))
            if form.is_valid():
                profile = form.save(commit=False)
                profile.user = request.user
                profile.save()
                form.save_m2m()
        else:
            form = InterestedFieldsForm()

        return render(request, 'reg/done.html', context={'form': form})

我知道问题出在视图中: form = InterestedFieldsForm(request.POST, instance=PersonalInfo.objects.get(user=user)) 当我删除实例时,表单会保存为用户的个人信息,但不会替换以前的表单,它会创建一个新表单。然后我再次放回实例并尝试保存表单,一切正常。是什么导致了这个问题?

【问题讨论】:

  • 您的用户没有相关的PersonalInfo 记录。
  • 我知道,我想使用此表单为其创建一个。我该怎么办
  • 如果get_or_create不存在则创建一个 - instance=PersonalInfo.objects.get_or_create(user=user)[0]
  • 在哪里以及如何?你能详细说明一下吗?我是新手

标签: django


【解决方案1】:
from django.contrib.auth import get_user_model

class PersonalInfo(models.Model):
    id = models.AutoField(primary_key=True)
    isCompleted = models.BooleanField(default=False)
    interested_fields = models.ManyToManyField(Field, blank=True)
    ### add this
    user = models.OneToOneField(get_user_model(), on_delete=models.CASCADE, related_name='personal_info')

执行迁移过程,然后在您的视图中:

def post(self, request, *args, **kwargs):
    user = request.user
    if request.method == 'POST':
        personalInfo, created = PersonalInfo.objects.get_or_create(user=user)
        form = InterestedFieldsForm(request.POST, instance=personalInfo)
        if form.is_valid():
            profile = form.save(commit=False)
            profile.user = request.user
            profile.save()
            form.save_m2m()
    else:
        form = InterestedFieldsForm()

    return render(request, 'reg/done.html', context={'form': form})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-26
    • 2012-05-10
    • 2013-03-02
    • 2021-05-07
    • 2017-01-12
    • 2014-04-12
    • 2018-03-11
    • 1970-01-01
    相关资源
    最近更新 更多