【问题标题】:Saving the form while there are two ForeignKeys,在有两个外键时保存表单,
【发布时间】:2017-08-31 04:57:52
【问题描述】:

我有两个模型如下图

class college(models.Model):
    name = models.CharField(max_length=256)
class education(models.Model):
    author = models.ForeignKey('auth.User')
    school = ForeignKey(college)
    field = models.CharField(max_length=200)
    startyear = models.IntegerField(blank =True,null = True)
    endyear = models.IntegerField(blank =True,null = True)

如下图所示

class EducationListView(ListView):
    template_name = 'education.html'

    def get_queryset(self):
        return education.objects.filter(author__username=self.request.user.username).order_by('-startyear')
class EducationCreate(CreateView):
    model = dupeducation
    fields = ('school','field','startyear','endyear')
    template_name = 'education_form.html'
    def form_valid(self, form):
        form.instance.author = self.request.user
        obj,created = college.objects.get_or_create(name=form['school'])
        obj.save()
        form.instance.school = obj
        return super(EducationCreate, self).form_valid(form)
class EducationUpdate(UpdateView):
    model = education
    fields = ('school','field','startyear','endyear')
    template_name = 'education_form.html'
    def form_valid(self, form):
        form.instance.author = self.request.user
        return super(EducationUpdate, self).form_valid(form)
class EducationDelete(DeleteView):
    model = education
    success_url = reverse_lazy('education')

我无法保存表单。它向学校领域抛出错误,例如“选择一个有效的选择。该选择不是可用的选择之一。”。

我的目标是获取学校字段的输入并使用 get_object_or_create 检查该字段。如果该对象不存在,则创建它并将其附加到学校领域。

【问题讨论】:

  • 您是在使用 JavaScript 还是只是在输入一个在 School 字段中不存在的值?
  • 它应该兼顾这两件事(用户应该能够从大学的现有对象中进行选择,或者如果该对象不存在,它应该首先创建然后使用它来关联)。实际上,我正在使用文本字段来获取学校的输入。

标签: django forms django-models django-views foreign-keys


【解决方案1】:

如果您进行调试,您会看到save() 没有被访问。你的问题出在Field validation

您需要做的是覆盖在保存任何对象之前调用的clean_<field>() 方法。

您可以在此处阅读更多信息:Django how to override clean() method in a subclass of custom form?

在覆盖clean_school() 时,您可以将值添加到数据库中,然后在save() 中简单地进行归因。

【讨论】:

    猜你喜欢
    • 2022-01-22
    • 2015-12-21
    • 2012-09-20
    • 1970-01-01
    • 2013-10-11
    • 1970-01-01
    • 2011-02-24
    • 2012-03-14
    • 2015-08-26
    相关资源
    最近更新 更多