代码之家  ›  专栏  ›  技术社区  ›  rdegges

如何使用多个字段填充默认表单数据?

  •  5
  • rdegges  · 技术社区  · 14 年前

    好吧,我已经抓取谷歌和Django文档2个多小时了(还有freenode上的IRC频道),还没弄清楚这个。

    Room

    class Room(models.Model):
        """
        A `Partyline` room. Rooms on the `Partyline`s are like mini-chatrooms. Each
        room has a variable amount of `Caller`s, and usually a moderator of some
        sort. Each `Partyline` has many rooms, and it is common for `Caller`s to
        join multiple rooms over the duration of their call.
        """
        LIVE = 0
        PRIVATE = 1
        ONE_ON_ONE = 2
        UNCENSORED = 3
        BULLETIN_BOARD = 4
        CHILL = 5
        PHONE_BOOTH = 6
        TYPE_CHOICES = (
            ('LR', 'Live Room'),
            ('PR', 'Private Room'),
            ('UR', 'Uncensored Room'),
        )
    
        type = models.CharField('Room Type', max_length=2, choices=TYPE_CHOICES)
        number = models.IntegerField('Room Number')
        partyline = models.ForeignKey(Partyline)
        owner = models.ForeignKey(User, blank=True, null=True)
        bans = models.ManyToManyField(Caller, blank=True, null=True)
    
        def __unicode__(self):
            return "%s - %s %d" % (self.partyline.name, self.type, self.number)
    

    我还有一个forms.py,它有下面的ModelForm来表示我的 型号:

    from django.forms import ModelForm
    
    from partyline_portal.rooms.models import Room
    
    
    class RoomForm(ModelForm):
        class Meta:
            model = Room
    

    我正在创建一个视图,允许管理员编辑给定的 房间

    def edit_room(request, id=None):
        """
        Edit various attributes of a specific `Room`. Room owners do not have
        access to this page. They cannot edit the attributes of the `Room`(s) that
        they control.
        """
        room = get_object_or_404(Room, id=id)
        if not room.is_owner(request.user):
            return HttpResponseForbidden('Forbidden.')
    
        if is_user_type(request.user, ['admin']):
            form_type = RoomForm
        elif is_user_type(request.user, ['lm']):
            form_type = LineManagerEditRoomForm
        elif is_user_type(request.user, ['lo']):
            form_type = LineOwnerEditRoomForm
    
        if request.method == 'POST':
            form = form_type(request.POST, instance=room)
            if form.is_valid():
                if 'owner' in form.cleaned_data:
                    room.owner = form.cleaned_data['owner']
    
            room.save()
        else:
            defaults = {'type': room.type, 'number': room.number, 'partyline': room.partyline.id}
            if room.owner:
                defaults['owner'] = room.owner.id
            if room.bans:
                defaults['bans'] = room.bans.all() ### this does not work properly!
    
            form = form_type(defaults, instance=room)
    
        variables = RequestContext(request, {'form': form, 'room': room})
        return render_to_response('portal/rooms/edit.html', variables)
    

    现在,当我查看页面时,这个视图可以正常工作。它显示所有的表单属性,所有的默认值都被填充(当用户执行GET时)。。。除了manytomy字段“bans”的默认值之外。

    基本上,如果管理员点击 房间 房间 对象。以下是需要更改的代码行(从视图中):

    defaults = {'type': room.type, 'number': room.number, 'partyline': room.partyline.id}
    if room.owner:
            defaults['owner'] = room.owner.id
    if room.bans:
            defaults['bans'] = room.bans.all() ### this does not work properly!
    

    更新

    if room.bans:
            defaults['bans'] = room.bans.all() ### this does not work properly!
    

    if room.bans:
            defaults['bans'] = [b.pk for b in room.bans.all()]
    

    当我查看页面时,它会显示一个可选择的列表 Caller

    1 回复  |  直到 14 年前
        1
  •  0
  •   Community Reversed Engineer    7 年前

    您可能需要使用“initial”: Django set default form values