Затем вы можете связать это с любым виджетом, который вам нужен в данный момент:

я естьForm, Я хочу включить скрытое поле, которое возвращает модель. Я установлю это значение в представлении; Мне просто нужно, чтобы это было опубликовано на следующей странице.

Какое поле я должен использовать в классе формы?

Ответы на вопрос(2)

clean_model_instance метод в форме, что хорошо, если вы делаете это только один раз в своей базе кода. Если вы будете делать это чаще, вам может быть полезно реализовать поле пользовательской модели.

Вот код, который у меня есть:

from django import forms

class ModelField(forms.Field):

    Model = None

    def prepare_value(self, value):
        """Inject entities' id value into the form's html data"""
        if isinstance(value, self.Model):
            return value.id
        return value

    def to_python(self, value):
        """More or less stolen from ModelChoiceField.to_python"""

        if value in self.empty_values:
            return None

        try:
            value = self.Model.objects.get(id=value)
        except (ValueError, self.Model.DoesNotExist):
            raise forms.ValidationError('%s does not exist'
                                         % self.Model.__class__.__name__.capitalize())

        return value

Если вы используете его в качестве базового класса, а затем специализируете его на своих собственных моделях, то он становится полезным на основе. Например:

# In app/fields.py
from .models import CustomModel

class CustomModelField(ModelField):

    Model = CustomModel

Затем вы можете связать это с любым виджетом, который вам нужен в данный момент:

# in app/forms.py
class MyForm(forms.Form):

    hidden_custom_model_field = CustomModelField(widget=forms.HiddenInput())

    other_widget_custom_model_field = CustomModelField(widget=MyCustomWidget())

которое возвращает модель? Итак, идентификатор экземпляра модели?

forms.HiddenInput widget должен помочь, будь то поле FK или CharField, в которое вы вставили идентификатор экземпляра модели.

class MyForm(forms.Form):
    hidden_2 = forms.CharField(widget=forms.HiddenInput())
    hidden_css = forms.CharField(widget=forms.MostWidgets(attrs={'style': 'display:none;'}))

Я полагаю, самый быстрый способ получить это работает

class MyForm(forms.Form):
    model_instance = forms.ModelChoiceField(queryset=MyModel.objects.all(), widget=forms.HiddenInput())

form = MyForm({'model_instance': '1'})
form.cleaned_data['model_instance']

Но мне не нравится идея предоставления MyModel.objects.all (), если вы все равно собираетесь указать один элемент.

Кажется, чтобы избежать такого поведения, вам придется переопределить форму__init__ с меньшимQuerySet.

Я думаю, что я предпочитаю старомодный способ:

class MyForm(forms.Form):
    model_instance = forms.CharField(widget=forms.HiddenInput())

    def clean_model_instance(self):
        data = self.cleaned_data['model_instance']
        if not data:
            raise forms.ValidationError()
        try:
            instance = MyModel.objects.get(id=data)
        except MyModel.DoesNotExist:
            raise forms.ValidationError()
        return instance
 fanny02 нояб. 2017 г., 14:48
forms.MostWidgets? имеется в виду большинство доступных виджетов?
 mpen14 янв. 2011 г., 02:28
Не думайForeignKey является допустимым полем формы ... это поле модели. Я бы предпочел, чтобы он возвращал экземпляр модели, а не целое число (когда я получаю его позже сform.cleaned_data['field'])
 Yuji 'Tomita' Tomita14 янв. 2011 г., 03:03
Хаха, ты абсолютно прав .. извини за это :)
 Yuji 'Tomita' Tomita03 нояб. 2017 г., 21:44
@fanny Да, вы можете просто скрыть виджет, установив атрибут style, ноHiddenInput() имеет больше смысла.

Ваш ответ на вопрос