Django Createview default value for a foreign key field

ε祈祈猫儿з 提交于 2020-01-04 09:39:19

问题


I have two classes(tables) schools and students that are related together(foreignkey) When I create a new student I want it to autofill the school field (which is a foreignkey to name field in School class(table) because it is already linked to a school. I have tried def get_initial(self): with no luck (it give me error). If anyone can point out what I am doing wrong…thanks Models.py:

class School(models.Model):
    school_pk = models.AutoField(primary_key=True)
    name = models.CharField(max_length=256)
    principal = models.CharField(max_length=256)
    location = models.CharField(max_length=256)
    def __str__(self):
        return str(self.name)
    def get_absolute_url(self):
        return reverse("basic_app:school_detail",kwargs={'school_pk':self.school_pk})
class Student(models.Model):
    student_pk = models.AutoField(primary_key=True)
    name = models.CharField(max_length=256)
    age = models.PositiveIntegerField()
    school = models.ForeignKey(School,related_name='students',on_delete=models.CASCADE,default=None)

    def __str__(self):
        return self.name
    def get_absolute_url(self):
        return reverse("basic_app:student_detail",kwargs={'student_pk':self.student_pk,'school':self.school})

views.py:

class StudentCreateView(CreateView):
    fields = ("name","age","school")
    model = models.Student
    template_name = 'basic_app/student_form.html'

    pk_url_kwarg = 'student_pk'
    slug_url_kwarg='school'
    def get_initial(self):
        school = get_object_or_404(models.School, school_pk=self.kwargs.get('school_pk'))
        return {
        'school':school,
    }

回答1:


Since you are storing the school's slug in the URL, it would be better to leave the school field out of the form. Then you can set the school in the form_valid method:

from django.shortcuts import get_object_or_404

class StudentCreateView(CreateView):
    fields = ("name","age",)  # don't include 'school' here
    ...

    def form_valid(self, form):
        school = get_object_or_404(School, slug=self.kwargs['school'])
        form.instance.school = school
        return super(StudentCreateView, self).form_valid(form)



回答2:


If you want to give a default value for your FK field go with default attribute. Django already gives the option to add a default value to your field.

DEFAULT_SCHOOL_ID = 1
class Student(models.Model):
   ...
   school=models.ForeignKey(School, default=DEFAULT_SCHOOL_ID)

You are an overriding get_initial method its used for Returns the initial data to use for forms on this view not actually adding a default value to your field



来源:https://stackoverflow.com/questions/49857585/django-createview-default-value-for-a-foreign-key-field

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!