ОК, вот что я сделал, чтобы использовать ListFields.MyClass
соответствует вашему Example
классу, а AnotherClass
соответствует вашему Choice_examples
.То, что я опишу, позволит вам использовать ListField
s в интерфейсе администратора и ваших собственных представлениях.
Я начну с самого начала
Вот как выглядит моя модель
class MyClass(models.Model):
field = ListField(models.ForeignKey(AnotherClass))
Я хотел иметь возможность использовать интерфейс администратора для создания / редактирования экземпляров этой модели, используя виджет множественного выбора для поля списка.Поэтому я создал несколько пользовательских классов следующим образом:
class ModelListField(ListField):
def formfield(self, **kwargs):
return FormListField(**kwargs)
class ListFieldWidget(SelectMultiple):
pass
class FormListField(MultipleChoiceField):
"""
This is a custom form field that can display a ModelListField as a Multiple Select GUI element.
"""
widget = ListFieldWidget
def clean(self, value):
#TODO: clean your data in whatever way is correct in your case and return cleaned data instead of just the value
return value
Эти классы позволяют использовать поле списка в админке.Затем я создал форму для использования на сайте администратора
class MyClassForm(ModelForm):
def __init__(self, *args, **kwargs):
super(MyClasstForm,self).__init__(*args, **kwargs)
self.fields['field'].widget.choices = [(i.pk, i) for i in AnotherClass.objects.all()]
if self.instance.pk:
self.fields['field'].initial = self.instance.field
class Meta:
model = MyClass
После этого я создал модель администратора и зарегистрировал ее на сайте администратора
class MyClassAdmin(admin.ModelAdmin):
form = MyClassForm
def __init__(self, model, admin_site):
super(MyClassAdmin,self).__init__(model, admin_site)
admin.site.register(MyClass, MyClassAdmin)
Это теперь работает вмой кодИмейте в виду, что этот подход может не совсем подходить для google_appengine, так как я не очень разбираюсь в том, как он работает, и он может создавать неэффективные запросы, такие.