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

Python 如何使用多个字段填充默认表单数据?,python,django,django-forms,Python,Django,Django Forms,好的,我已经抓取google和Django文档超过2个小时了(以及freenode上的IRC频道),但还没有弄明白这一点 基本上,我有一个名为房间的模型,如下所示: 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 usua

好的,我已经抓取google和Django文档超过2个小时了(以及freenode上的IRC频道),但还没有弄明白这一点

基本上,我有一个名为
房间
的模型,如下所示:

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
我正在创建一个视图,允许管理员编辑给定的
Room
对象。以下是我的观点(到目前为止):

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

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

我必须使用一些其他语法来指定“bans”字段的默认值。这件事我真的很紧张,非常感谢你的帮助

谢谢

更新

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

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


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

您可能需要使用“初始”:

如果编辑室的编辑只能编辑一个字段,那么只给他们一个字段来编辑并显示房间的其余数据作为显示文本。这也可以解决您初始化M2M默认字段的问题“它不能正常工作”是什么意思?它是生成一个eception还是什么都没有?“initial”与“default”是一样的,它们都可以工作。正如我上面所说的,代码当前正确地设置了所有默认值,但“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()]