django多对多形式显示人类可读

adr*_*edo 5 django many-to-many

我有以下模型:

CURSES=(('python','Python'),('django','Django'),...)
class Asig(models.Model):
    ...
    name = models.CharField(max_length=100, choices=CURSES)

class Profesor(AbstractUser):
    ...
    asigs = models.ManyToManyField(Asig)
Run Code Online (Sandbox Code Playgroud)

然后,当我使用ModelForm渲染表单时,多对多字段使用'python'字符串而不是'Python'来显示自身,此外,当我查看呈现的html编码时,multiselect选项如下所示:

<option value='1'>python</option>
Run Code Online (Sandbox Code Playgroud)

代替

<option value='python'>Python</option> 
Run Code Online (Sandbox Code Playgroud)

Ala*_*air 5

如果要在模型的__str__, 方法中使用值“Python”,则应使用self.get_name_display()代替self.name

class Asig(models.Model):
    ...
    name = models.CharField(max_length=100, choices=CURSES)

    def __str__(self):  
        # use @python_2_unicode_compatible or define __unicode__ if using Python 2
        return self.get_name_display()
Run Code Online (Sandbox Code Playgroud)

您无法轻松更改多对多字段以value='python'代替value='1'(主键)使用。这就是多对多字段的工作方式。