python - 如何使用 ManyToMany 字段填充默认表单数据?

标签 python django django-forms

好吧,我已经抓取了 2 个多小时的谷歌和 Django 文档(以及 freenode 上的 IRC channel ),但一直无法弄清楚这一点。

基本上,我有一个名为 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 来表示我的 Room 模型:

from django.forms import ModelForm

from partyline_portal.rooms.models import Room


class RoomForm(ModelForm):
    class Meta:
        model = Room

我正在创建一个允许管理员编辑给定 Room 对象的 View 。这是我的观点(到目前为止):

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)

现在,当我查看页面时,此 View 工作正常。它显示了所有表单属性,并且填写了所有默认值(当用户执行 GET 操作时)... ManyToMany 字段“bans”的默认值除外。

基本上,如果管理员单击 Room 对象进行编辑,他们转到的页面将显示所有 Room 的默认值,“bans”除外.无论我做什么,我都找不到让 Django 显示 Room 对象当前“被禁止的用户”的方法。这是需要更改的代码行(从 View 中):

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!

我必须使用一些其他语法来指定“bans”字段的默认值。我真的一直在努力解决这个问题,非常感谢您的帮助。

谢谢!

更新

lazerscience 实际上在他的一条评论中帮助我找到了解决方案。基本上,它的工作方式是传递一个主键列表。为了让它工作,我必须改变:

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()]

然后 bam,它立即开始工作(当我查看页面时,它将显示一个可选的 Caller 列表,已经突出显示(选中)已被禁止的调用者。

最佳答案

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

关于python - 如何使用 ManyToMany 字段填充默认表单数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2983183/

相关文章:

python - 方法解析顺序 (MRO) 如何在此 Python 代码中工作

python - count() 方法中的整数到 bool 值的转换

json - 如何在django中返回JSON

python - Django - 使用多种形式

python - 合并排序中的不可排序类型 "int() <= list()"

Python - 绘制带有节点位置的图形

python - 属性错误 : can't set attribute

python - kombu.exceptions.EncodeError : [<Vkwallpost: Vkwallpost object> . .. 不是 JSON 可序列化的 - 仅在本地主机上

python - 如何使用 Django 设置 ATOMIC_REQUESTS?它没有按我的预期工作

django - 如何在Django ModelForm的下拉列表中指定值的顺序?