繁体   English   中英

如何定义外键关系?

[英]How to define the foreign key relationship?

我是 django 和数据库概念的新手。

当我尝试通过前端注册学生时收到 1042 错误代码,但不知道我的错误在哪里

如果有人可以提供帮助,那就太好了。

我尝试了不同的方法,但没有一个是有益的。

我可以通过 django 的管理面板添加学生,但不能通过前端执行相同的操作。

这是此处的屏幕截图。

模型.py

class Session(models.Model):
    session = models.CharField(max_length=150, default=" ")
    def __str__(self):
        return self.session
    
    def get_absolute_url(self):
        return reverse('datapage')
    
    
class Student(models.Model):
    user = models.OneToOneField(User, on_delete = models.CASCADE, primary_key = True)
    phone_number = models.CharField(max_length=20, blank = True)
    semester = models.CharField(max_length=20, blank = True)
    session_year = models.ForeignKey(Session, on_delete = models.CASCADE)
    
    def __str__(self):
        return str(self.user)

forms.py

session_years = Session.objects.all()
session_year_list = []
for session_year in session_years:
    single_session_year = (session_year.id, session_year.session)
    session_year_list.append(single_session_year)

class StudentSignUpForm(UserCreationForm):
    first_name = forms.CharField(required=True)
    last_name = forms.CharField(required=True)
    email = forms.EmailField(required=True)
    username = forms.CharField(required=True)
    phone_number = forms.CharField(required=True)
    semester = forms.CharField(required=True)
    
    def clean_email(self):
        email = self.cleaned_data.get('email')
        email = email.lower()
        if User.objects.filter(email__iexact=email).exists():
            raise forms.ValidationError('A user has already registered using this email')
        return email
    
    def clean_username(self):
        username = self.cleaned_data.get('username')
        if User.objects.filter(email__iexact=username).exists():
            raise forms.ValidationError('A user has already registered using this username')
        return username
    
    class Meta(UserCreationForm.Meta):
        model = User
        fields = ['first_name', 'last_name', 'email', 'username']
        

    @transaction.atomic
    def save(self):
        user = super().save(commit=False)
        user.is_student = True
        user.first_name = self.cleaned_data.get('first_name')
        user.last_name = self.cleaned_data.get('last_name')
        user.email = self.cleaned_data.get('email')
        user.username = self.cleaned_data.get('username')
        user.save()
        student = Student.objects.create(user=user)
        student.phone_number=self.cleaned_data.get('phone_number')
        student.semester=self.cleaned_data.get('semester')
        student.session_year=self.cleaned_data.get('session_year')
        student.save()
        return user

视图.py

class StudentRegister(LoggedInRedirectMixin, CreateView):
    model = User
    form_class = StudentSignUpForm
    template_name = 'registration/user_register.html'

    def form_valid(self, form_class):
        user = form_class.save()
        return redirect('datapage')

@Vatsai Vohera - 如果我错了请纠正我。

 session = Session.objects.get(session=self.cleaned_data.get('session_year')
    student.session_year = session

    

您正在将请求的数据添加到不起作用的 session_year 字段中,而您必须将请求的数据保存到 model Session 字段 session 中。我希望这对您有用。

您可以在 ForeignKey 属性中使用related_name='...'字段并添加以下内容:

session_year = models.ForeignKey(Session,related_name='some thing', on_delete = models.CASCADE, null = True)

那么你必须通过相关名称调用 session_year

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM