Python Django Admin未将数据保存到数据库

Python Django Admin未将数据保存到数据库,python,django,django-admin,django-database,Python,Django,Django Admin,Django Database,我试图将数据从Django管理员保存到数据库中,但不知何故,它没有发生。我已经在我的一个应用程序中创建了一个表单,供我的管理员使用。我是Django的新手,非常感谢您的帮助。 以下是相关代码: models.py forms.py 管理员 UserProfile工作正常,但是admin中的Mentor表单没有在数据库中保存任何内容。它会在数据库中创建空白条目,因此我知道前端和后端正在交谈,但没有传递任何数据。任何帮助都会很有帮助 def save(self, commit=True):

我试图将数据从Django管理员保存到数据库中,但不知何故,它没有发生。我已经在我的一个应用程序中创建了一个表单,供我的管理员使用。我是Django的新手,非常感谢您的帮助。 以下是相关代码:

models.py forms.py 管理员 UserProfile工作正常,但是admin中的Mentor表单没有在数据库中保存任何内容。它会在数据库中创建空白条目,因此我知道前端和后端正在交谈,但没有传递任何数据。任何帮助都会很有帮助

def save(self, commit=True):
    # here you define `mentor_name`. OK.
    mentor_name = self.cleaned_data.get('mentor_name', None)
    # here you redefine `mentor_name`. I guess it is a typo and should be `mentee_name`.
    mentor_name = self.cleaned_data.get('mentee_name', None)
    # And... you don't do anything with these variables.
    return super(MentorForm, self).save(commit=commit)
此方法相当于:

def save(self, commit=True):
    return super(MentorForm, self).save(commit=commit)
这相当于根本不重写save方法

那么这个呢

def save_model(self, request, obj, form, change):
    super(MentorAdmin, self).save_model(request, obj, form, change)
重写方法并仅使用完全相同的参数调用父方法的目的是什么

但实际问题是:

mentor_choices = tuple(UserProfile.objects.filter(user__is_staff=1).order_by('name').values_list('name', 'name'))
mentee_choices = tuple(UserProfile.objects.exclude(user__is_staff=1).order_by('name').values_list('name', 'name'))
mentor_name = forms.ChoiceField(choices=mentor_choices)
mentee_name = forms.ChoiceField(choices=mentee_choices)

class Meta:
    model = Mentor
    fields = ('mentor_name', 'mentee_name')
您使用的是
ModelForm
,但
Mentor
的字段中没有一个位于
字段中。除了使用
Mentor.Mentor=None
Mentor.mentee=None
保存一行之外,您希望它做什么。你甚至没有提到那些领域

你为什么要用
CharField
来表示
Mentor.Mentor
Mentor.mentee
,而你可能需要外键

class Mentor(models.Model):
    mentor = models.ForeignKey(UserProfile, models.PROTECT,
                               related_name='mentees')
    mentee = models.ForeignKey(UserProfile, models.PROTECT,
                               related_name='mentors')

class MentorForm(forms.ModelForm):

    class Meta:
        model = Mentor
        fields = ('mentor', 'mentee')

    mentor = forms.ModelChoiceField(queryset=UserProfile.objects.filter(
        user__is_staff=True).order_by('name'))
    mentee = forms.ModelChoiceField(queryset=UserProfile.objects.exclude(
        user__is_staff=True).order_by('name'))
或者更好:

class Mentor(models.Model):
    mentor = models.ForeignKey(
        UserProfile, models.PROTECT, related_name='mentees',
        limit_choices_to={'user__is_staff': True},
    )
    mentee = models.ForeignKey(
        UserProfile, models.PROTECT, related_name='mentors',
        limit_choices_to={'user__is_staff': False},
    )

这样可以避免您创建表单。

您确定是否调用了
MentorAdmin.save\u model()
?尝试在方法顶部添加日志消息。@JohnGordon是的,正在调用该方法。我在调试模式下运行它,检查是否调用了该方法以及是否正在调用该方法。它按预期显示了所有参数,除了“change”会得到一个错误的结果,非常感谢。这是我的第一个Django项目,因此出现了愚蠢的错误。谢谢你帮助我
mentor_choices = tuple(UserProfile.objects.filter(user__is_staff=1).order_by('name').values_list('name', 'name'))
mentee_choices = tuple(UserProfile.objects.exclude(user__is_staff=1).order_by('name').values_list('name', 'name'))
mentor_name = forms.ChoiceField(choices=mentor_choices)
mentee_name = forms.ChoiceField(choices=mentee_choices)

class Meta:
    model = Mentor
    fields = ('mentor_name', 'mentee_name')
class Mentor(models.Model):
    mentor = models.ForeignKey(UserProfile, models.PROTECT,
                               related_name='mentees')
    mentee = models.ForeignKey(UserProfile, models.PROTECT,
                               related_name='mentors')

class MentorForm(forms.ModelForm):

    class Meta:
        model = Mentor
        fields = ('mentor', 'mentee')

    mentor = forms.ModelChoiceField(queryset=UserProfile.objects.filter(
        user__is_staff=True).order_by('name'))
    mentee = forms.ModelChoiceField(queryset=UserProfile.objects.exclude(
        user__is_staff=True).order_by('name'))
class Mentor(models.Model):
    mentor = models.ForeignKey(
        UserProfile, models.PROTECT, related_name='mentees',
        limit_choices_to={'user__is_staff': True},
    )
    mentee = models.ForeignKey(
        UserProfile, models.PROTECT, related_name='mentors',
        limit_choices_to={'user__is_staff': False},
    )