Django ModelForm - 从ManyToManyField

时间:2018-06-07 16:32:29

标签: python django django-models django-forms many-to-many

我需要从PreceptorForm获取选定的年份值。我可以使用post.internal_tel获取internal_tel,但是因为它是ManyToManyField所以我不能用年份来做。我需要像preceptor.year.add(post.year)这样的东西,但它给了我一个错误。最好的方法是什么?

models.py

class Year(models.Model):
    year_number = models.IntegerField(choices=YEAR_CHOICES)
    division = models.CharField(choices=DIVISION_CHOICES, max_length=1)

    def getStudents(self):
        results = Student.objects.filter(year=self)
        return results

    def __str__(self):
        return "{}-{}".format(self.year_number, self.division)

class Preceptor(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete = models.CASCADE)
    internal_tel = models.IntegerField(blank=True)
    year = models.ManyToManyField(Year,blank=True,related_name='preceptores')

    def getYear(self):
        results = self.year.all()
        return results

    def __str__(self):
        return "{} {}".format(self.user.first_name, self.user.last_name)

forms.py

class PreceptorForm(ModelForm):
    class Meta: 
        model = Preceptor
        fields = '__all__'
        exclude = ['user']  

views.py

def register_user(request):
    if request.method == "POST":
        form = PreceptorForm(request.POST)
        username = request.POST['username']
        password = request.POST['password']
        sec_pass = request.POST['sec_password']
        email = request.POST['email']
        first_name = request.POST['first_name']
        last_name = request.POST['last_name']
        if form.is_valid(): 
            if password == sec_pass:
                user = User.objects.create_user(username, email, password)
                user.is_active = True
                user.first_name = first_name
                user.last_name = last_name
                user.save()
                print "form"
                post = form.save(commit=False) 
                post.user = user
                preceptor = Preceptor(user=user,internal_tel=post.internal_tel)
                preceptor.save()
                preceptor.year.add(post.year)
                preceptor.save()
            return redirect('/')
    else:
        form = PreceptorForm()
    return render(request, 'register.html', {'form': form})

我在preceptor.year.add(post.year)遇到此错误:

<主持人:'姓名' >需要有一个字段的值" id"在此之前可以使用多对多关系。

0 个答案:

没有答案