выбор вариантов запроса с forms.ModelChoiceField, который не показывает object1 - PullRequest
1 голос
/ 23 мая 2019

Я создаю веб-сайт в Джанго, который имеет два приложения и модели - максимумы и тренировки. Я хочу, чтобы форма maxes могла запрашивать модель тренировок для получения лифтов.

Я могу заставить его работать, добавив:

def __str__(self):
    return '%s' % (self.lift)

тренировки / models.py

from django.db import models
from utils.models import (CreationModificationDateMixin)
# Create your models here.

class wplans(CreationModificationDateMixin):
    wplan   = models.CharField(max_length=50)
    wnumber = models.IntegerField(default=0)
    lift    = models.CharField(max_length=30)
    weight  = models.IntegerField(default=0)
    sets    = models.IntegerField(default=0)
    reps    = models.IntegerField(default=0)

    def __str__(self):
        return '%s' % (self.lift)
```python 

maxes/forms.py
```python
class maxesModelForm(forms.ModelForm):
    lift = forms.ModelChoiceField(
        label=("Lift"),
        queryset=wplans.objects.all(),
        required=True
    )

Это работает, но я хочу иметь возможность добавить поле wplan в форму, но теперь оно все еще показывает название лифта wplan. Если я достану def __str__, он показывает wplanobject (1)

1 Ответ

1 голос
/ 23 мая 2019

Вы можете настроить метку с помощью подкласса ModelChoiceField [Django-doc] и переопределить label_from_instance(..) метод [Джанго-док] :

# app/fields.py

from django.forms.models import ModelChoiceField

class WpanModelChoiceField(ModelChoiceField):

    def <b>label_from_instance</b>(self, obj):
        return <b>str(obj.lift)</b>

В вашем MaxesModelForm вы можете использовать:

# app/forms.py

# ...

from app.fields import <b>WpanModelChoiceField</b>

class maxesModelForm(forms.ModelForm):
    lift = <b>WpanModelChoiceField</b>(
        label=("Lift"),
        queryset=wplans.objects.all(),
        required=True
    )

Мы также можем напрямую исправить ModelChoiceField, например:

# app/forms.py

# ...

class maxesModelForm(forms.ModelForm):
    lift = <b>ModelChoiceField</b>(
        label=("Lift"),
        queryset=wplans.objects.all(),
        required=True
    )
    <b>lift.label_from_instance = lambda obj: str(obj.lift)</b>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...