Django Admin没有将数据保存到数据库

时间:2016-07-19 19:02:41

标签: python django django-admin django-database

我正在尝试将数据从我的Django Admin保存到我的数据库,但不知何故它没有发生。我在我的管理员使用的一个应用程序中创建了一个表单。我是Django的新手,任何帮助都将不胜感激。 以下是相关代码:

models.py

from django import forms
from models import UserProfile, Mentor
from django_countries.fields import CountryField
from django.contrib.auth.models import User
from reports.models import Reports

class UserProfileForm(forms.ModelForm):

    name = forms.CharField(max_length=100)
    bio = forms.Textarea()
    image = forms.FileField(label='Profile Photo')
    country = CountryField(blank_label='(Select Country)')
    city = forms.CharField(max_length=100)
    twitter = forms.CharField(max_length=100, required=False)
    linkedin = forms.CharField(max_length=100, required=False)

    class Meta:
        model = UserProfile
        exclude = ('user',)

class MentorForm(forms.ModelForm):
    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)

    def save(self, commit=True):
        mentor_name = self.cleaned_data.get('mentor_name', None)
        mentor_name = self.cleaned_data.get('mentee_name', None)
        return super(MentorForm, self).save(commit=commit)

    class Meta:
        model = Mentor
        fields= ('mentor_name', 'mentee_name')

forms.py

from django.contrib import admin
from .models import UserProfile, Mentor
from.forms import MentorForm

class UserProfileAdmin(admin.ModelAdmin):
    list_display = ('user',)
    search_fields = ['user']

    def save_model(self, request, obj, form, change):
        obj.created_by = request.user
        obj.save()
admin.site.register(UserProfile, UserProfileAdmin )

class MentorAdmin(admin.ModelAdmin):
    list_display = ('__unicode__','mentee')
    search_fields = ['mentee', 'mentor']
    form = MentorForm

    fieldsets = (
        (None,{
            'fields': ('mentor_name', 'mentee_name'),
        }),
    )

    def save_model(self, request, obj, form, change):
        super(MentorAdmin, self).save_model(request, obj, form, change)

admin.site.register(Mentor, MentorAdmin )

admin.py

R1C1

UserProfile工作正常,但管理员中的Mentor表单不会保存数据库中的任何内容。它会在数据库中创建空白条目,因此我知道前端和后端正在通话但没有数据传递。任何帮助都会非常有帮助

1 个答案:

答案 0 :(得分:2)

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)

这相当于根本没有覆盖保存方法。

那怎么样?

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的所有字段都没有fields。除了使用Mentor.mentor = NoneMentor.mentee = None保存一行之外,您还希望做什么?你甚至没有提到那些领域。

为什么您在CharFieldMentor.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},
    )

这可以避免您创建表单。

相关问题