bugfix> python > 投稿

ドロップダウンから出発地と目的地を選択するようにユーザーに求めるフォームがあります。しかし、ラベルは私が望んでいるものではありません。これを変更したいと思います。

Models.py:

class locations(models.Model):
    id = models.AutoField(primary_key=True)
    location = models.TextField()
class drones(models.Model):
    origin = models.ForeignKey('locations', models.PROTECT, null=True, related_name='destination_id')
    destination = models.ForeignKey('locations', models.PROTECT, null=True, related_name='origin_id')

Views.py:

def book(request):
    form = BookForm(request.POST or None)
    context = {
        "form": form
    }
    return render(request, '../../drone_system/templates/drone_system/book.html', context)

Book.html:

{% extends "drone_system/base.html" %}
{% block content %}
    <nav class="mx-auto card w-25" style=text-align:center;border:none;padding-top:12%>
        <form action="book" method="POST">{% csrf_token %}
            <h3 style="padding-bottom: 10px">Book</h3>
            <div class="form-group">
                <div>
                    <label for="Origin">Origin</label>
                    {{ form.origin }}
                    <br>
                    <label for="Destination">Destination</label>
                    {{ form.destination }}
                </div>
            </div>
            <button type="submit" class="btn btn-primary btn-lg btn-block">Book</button>
        </form>
    </nav>
{% endblock %}

Forms.py:

from django import forms
from django.forms import ModelForm
from .models import drones
class BookForm(ModelForm):
    class Meta:
        model = drones
        fields = ['origin', 'destination']
        widgets = {
            'origin': forms.Select(
                attrs={
                    'class': 'my-1 mr-2',
                },
                choices=((1, 'London'), (2, 'Plymouth'), (3, 'Swansea'), (4, 'Birmingham'), (5, 'Manchester'), (6, 'Edinburgh'), (7, 'Belfast'))
            ),
            'destination': forms.Select(
                attrs={
                    'class': 'my-1 mr-2',
                },
                choices=((1, 'London'), (2, 'Plymouth'), (3, 'Swansea'), (4, 'Birmingham'), (5, 'Manchester'), (6, 'Edinburgh'), (7, 'Belfast'))
            )
        }

ご覧のとおり、これは次のようになります。 ロケーションオブジェクト(1)、ロケーションオブジェクト(2)..。

代わりに、ロンドン、プリマスなどの都市の名前を表示したいと思います。これらの名前もロケーションモデル(locations.location)の一部です。また、forms.pyでchoicesを使用してみましたが、何も変更されていません。これを都市名に変更するにはどうすればよいですか?

回答 2 件
  • 追加する必要があります __str__ モデル内にあるため、文字列表現があります

    class locations(models.Model):
        ...
        def __str__(self):
            return self.location
    class drones(models.Model):
        ...
        def __str__(self):
            return self.destination.location
    
    

  • これがあなたを助けることができるドキュメントへのリンクです: https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#overriding-the-default-fields

    それらは、選択肢のラベルを含むModelFormフィールドをオーバーライドする例を示しています。

あなたの答え