2012-02-04 50 views
2

我有以下设置。在django管理面板中一次添加多条记录

from django.db import models 
from django.contrib.auth.models import User 

class Event(models.Model): 
    name = models.CharField(max_length=64) 
    date = models.DateField() 

ATTENDANCE_CHOICES = (
    ('A','Attending'), 
    ('N','Absent'), 
    ('L','Taken ill'), 
) 

class Attendance(models.Model): 
    student = models.ForeignKey(User) 
    event = models.ForeignKey(Event) 
    status = models.CharField(max_length=1, choices=ATTENDANCE_CHOICES) 

简而言之:学生(用户)参加或不参加课程(活动),这是由出勤登记。 问题是一次添加一个考勤记录。

我正在寻找的是一种为每个班级(每个Event对象)提供表单的方法,其中包括所有学生和出勤状态单选按钮或其旁边的下拉列表。

事情是这样的:

http://i.imgur.com/jANIZ.png

我已经看过有关多/批量记录插入通过Django管理许多讨论和我开始怀疑这是甚至与Django管理可能还是我必须创建这种形式从头开始?无论哪种方式,最好的(最Django-ish)方法是什么?

回答

3

“这甚至可能吗?”开箱即可。

查看django Admin应用程序,Inline,ModelForms和RadioSelect小部件。

class MyForm(forms.ModelForm): 
    class Meta: 
     model = Attendance 

    def __init__(self, *args, **kwargs): 
     super(MyForm, self).__init__(*args, **kwargs 
     self.fields['status'].widget = forms.RadioSelect(choices=self.fields['status'].choices) 

class AttendanceInline(admin.TabularInline): 
    model = Attendance 
    form = MyForm 

class EventAdmin(admin.ModelAdmin): 
    inlines = [AttendanceInline] 

    def save_model(self, request, obj, form, change): 
     obj.save() 
     for user in User.objects.all(): 
      obj.attendance_set.create(user=user, status='') 
      # you should consider a null field or a possible choice for "Undecided" 

admin.site.register(Event, EventAdmin) 
+0

谢谢,这将是它的一半。我仍然需要为每个学生设置这样的线路,因此不需要为每个条目选择学生表单下拉列表。 在其他世界中,每个User.objects.all()用户已设置一行。 – liepumartins 2012-02-04 14:59:02

+0

然后执行诸如覆盖保存方法来生成所有关系或使用管理操作。 – 2012-02-04 19:16:19

+0

几乎是我希望实现的。谢谢,现在我有一些线索要进一步挖掘。 – liepumartins 2012-02-04 21:35:05