Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

DjangoのModelFormでForeignKeyフィールド未選択の見た目を変える方法

More than 5 years have passed since last update.

ModelFormを継承したフォームを実装する際に、ForeignKeyのフィールドにwidgetとしてforms.RadioSelectを適用したところ、下図のように未選択のときの項目が「---------」と表示されており、UI的にちょっと変だなと思ったので、それを変更したときの方法です。

※widgetを適用せず、デフォルトのforms.Selectの場合は「---------」でも普通そうですけど。

デフォルトの図

デフォルト

変更後の図

変更後

コード

models.py

# -*-coding: utf-8-*-                                                                                                                                           
from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=30)

    def __unicode__(self):
        return self.name

class Article(models.Model):
    title = models.CharField(max_length=100)
    author = models.ForeignKey(Author)

forms.py

# -*-coding: utf-8-*-                                                                                                                                           
from django import forms
from django.forms import ModelForm
from .models import Article, Author

class ArticleForm(ModelForm):
    class Meta:
        model = Article
        fields = '__all__'

    author = forms.ModelChoiceField(
        queryset=Author.objects.all(),
        widget=forms.RadioSelect,
        empty_label='該当なし'
    )

説明

forms.ModelChoiceFieldにempty_labelで任意の文字列を渡してやればOKです。

author = forms.ModelChoiceField(
    queryset=Author.objects.all(),
    widget=forms.RadioSelect,
    empty_label='該当なし'
)
masutaro
業務でPerlを8年ほど使っていましたが、最近は専らPython + Djangoを使っています。 つまづいたときは、自分の力が及ぶ限り、ミドルウェアやフレームワーク、モジュールの実装を読んで解決することをポリシーにやってます。
https://kakadu.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away