重新加载django admin内联表单从后端更新数据

时间:2017-08-16 22:56:28

标签: python django django-admin

我有一个用于父模型的ModelForm和一个用于外键相关模型的InlineForm。内联表单数据是只读的,只能通过文件上载进行更新。我有这个工作在初始创建和保存,但如果您通过上传新文件替换学生,而上传和保存后数据正确更新,内联表单不会在此保存后正确重新加载并显示错误。但是,如果您离开并返回一切看起来不错。

Models.py

class Room(models.Model):
    room_id = models.AutoField(primary_key=True)
    name = models.TextField(blank=False, verbose_name = "Room Name ")
    code = models.TextField(blank=False)
    file = models.TextField(blank=False)


    class Meta(object):
        managed = False
        db_table = 'public\".\"room'


class Student(models.Model):
    room = models.ForeignKey(Room, related_name="students, to_field="room_id", db_column="room_id")
    student_id = models.TextField(blank=False, primary_key=False)

    @property
    def grade(self):
        return util.get_grade(self.student_id)

    class Meta(object):
        managed = False
        db_table = 'public\".\"student’

admin.py

class StudentsInline(admin.TabularInline):
    model = Student
    form = StudentInlineForm
    formset = StudentFormSet

    readonly_fields = ('student_id', 'grade')
    extra = 0

    def get_actions(self, request):
        '''
        Removes the delete action
        '''
        actions = super(StudentsInline, self).get_actions(request)
        del actions['delete_selected']
        return actions

    def has_delete_permission(self, request, obj=None):
        return False

    def has_add_permission(self, request, obj=None):
        return False


class RoomAdmin(admin.ModelAdmin):
    def student_count(self, obj):
        return obj.students.count()
    student_count.short_description = " Total Enrolled "

    form = RoomForm
    list_display = [name', ‘code']
    readonly_fields = ['student_count']
    list_per_page = 25
    inlines = [StudentsInline]

    def get_actions(self, request):
        actions = super(RoomAdmin, self).get_actions(request)
        del actions['delete_selected']
        return actions

    def has_delete_permission(self, request, obj=None):
        return False

    def save_formset(self, request, form, formset, change):
        form.instance.file = 'processed file'
        form.instance.save 
        formset.save()  

forms_admin.py

class RoomsForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(RoomsForm, self).__init__(*args, **kwargs)
        self.fields[‘name'].required = True
        self.fields[‘code'].required = True
        self.fields['file'] = forms.FileField(
            label='Upload your enrollees:'


    def load_file(self, upload_file):
        student_list = []
        data = upload_file.read() #simplified for this example
        for s in reader:
            s_id = s[0]
            new_student = Student(student_id=s_id)
            student_list.append(new_student)
        return student_list

    def save(self, *args, **kwargs):
        room_form = super(RoomsForm, self).save(commit=False)
        enrollee_list = self.load_file(self.instance.file.file)

        if instance.room_id is None:
            instance.file = 'uploaded'
            instance = super(RoomsForm, self).save(commit=True)

        Student.objects.filter(room_id=self.instance.room_id).all().delete()
        instance.students.add(*enrollee_list)
        return instance


    class Meta:
        model = Room
        fields = '__all__'


class StudentForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(StudentForm, self).__init__(*args, **kwargs)

0 个答案:

没有答案