Фильтр модели django ForeignKey в админке?

Привет, мне действительно нужен очень-очень простой пример. Сначала мои модели:

#This my student models
from django.db import models
SEX_CHOICES= (
    ('M', 'Male'),
    ('F', 'Female'),
)
class Students(models.Model):
    student_name = models.CharField(max_length=50)
    student_sex = models.CharField(max_length=8, choices=SEX_CHOICES)
    student_city = models.Charfield(max_length=50)
    student_bio = models.TextField()

    def __unicode__(self):
        return self.student_name

ХОРОШО. Давайте посмотрим на мою модель ClassRooms.

#This my ClassRooms models
from django.db import models
from myproject.students.models import *
class ClassRooms(models.Model):
    class_number= models.CharField(max_length=50)
    class_student_cities = models.ForeignKey(Students)
    class_year = models.DateField()

    def __unicode__(self):
        return self.class_number

Как я могу отобразить в области class_student_cities данные Student.student_city? Я предполагаю, что о django-админке. Когда я делаю это withclass_student_cities = models.ForeignKey(Students), я просто вижу в этой области данные Student.student_name (например: Джон Смит). Я хочу видеть ТОЛЬКО данные Student.student_cities (например, NewYork). Вы можете привести небольшой пример?

Должен ли я использовать что-то вроде этого:

class_student_cities = models.ForeignKey(Students.student_cities)

Огромное спасибо!


person abraham    schedule 25.07.2011    source источник
comment
Можете ли вы описать отношения между учащимися и классными комнатами? Что вы хотите знать о городах и классах? (Например, каковы все города учеников в классе?) Судя по названиям моделей, я ожидаю, что у ученика будет поле типа classroom = models.ForeignKey(ClassRoom), а не наоборот. Ознакомьтесь с документацией и примерами для внешних ключей. в джанго.   -  person tcarobruce    schedule 26.07.2011
comment
К вашему сведению, я объединил вашу незарегистрированную учетную запись с этой.   -  person    schedule 29.07.2011


Ответы (1)


Попробуйте переопределить метод unicode.

def __unicode__(self):
        return self.student_city 

Так вы увидите в поле студенческий город.

Что ж, я попытался переделать ваше приложение для установки данных с помощью класса форм. Что-то вроде этого в admin.py в вашем приложении:

from django.contrib import admin
from django import forms
from myapp.models import *

class ClassRoomsAdminForm(forms.ModelForm):
    class Meta:
        model = ClassRoom
    def __init__(self, *arg, **kwargs):
        super(ClassRoomsAdminForm, self).__init__(*arg, **kwargs)
        self.fields[' class_student_cities'].choices = [(csc.id,csc.student_city) for csc in Students.objects.all()

class ClassRoomsAdmin(admin.ModelAdmin):
    form = ClassRoomsAdminForm

admin.site.register(ClassRooms,ClassRoomsAdmin)

Возможно, вам нужно будет что-то исправить, но я надеюсь, что это сработает. Вы установите функцию init для своих форм, поэтому в панели администратора вы устанавливаете все варианты для всего, что вы храните в своей модели «Студенты». csc.id, вам нужно будет сделать этот объект итерируемым (города не уникальны), а затем вы можете выбрать все из модели «Студенты» для установки в поле.

person Dracontis    schedule 25.07.2011
comment
Прошу прощения за такое количество редакций, но мне нужен идеальный код, чтобы ответить на этот вопрос. - person Dracontis; 26.07.2011
comment
хм, во втором примере я получаю синтаксическую ошибку в этой строке: self.fields[' class_student_cities'].choices = [(csc.id,csc.student_city) для csc в Student.objects.all() - person abraham; 26.07.2011
comment
Хорошо, я исправил, попробуем еще раз :) - person abraham; 26.07.2011
comment
AttributeError в объекте /admin/classes/classrooms/add/ «ClassRoomsForm» нет атрибута «поля» - person abraham; 26.07.2011
comment
Ах, извините, когда я редактирую свою запись, я удаляю важную вещь. Посмотрите теперь на пример, я добавляю строку «super», чтобы получить доступ к объекту. - person Dracontis; 26.07.2011
comment
Ты мой герой! Огромное спасибо! Небольшое исправление: super(ClassRoomsAdminForm, self).__init__(*arg, **kwargs) - person abraham; 26.07.2011
comment
Исправил в ответ. Я рад, что, наконец, мои знания django кому-то помогли, и я был бы рад, если бы вы могли отметить ответ как принятый. :) - person Dracontis; 26.07.2011