LINUX.ORG.RU

Снова Django


0

0

Есть 2 класса:

class Category (models.Model):
	def __repr__(self): return self.title

	title      = models.CharField('Название', max_length=255)
	descr      = models.TextField('Описание')
	
	class Meta:
		verbose_name = 'Категория'
		verbose_name_plural = 'Категории'
	
	class Admin:
		list_display = ('title', 'descr')
		search_fields = ('title', 'descr')

class Company (models.Model):
	def __repr__(self): return self.title

	title      = models.CharField('Название', max_length=255)
	descr      = models.TextField('Описание')
	address    = models.TextField('Адрес')
	categories = models.ManyToManyField(Category, verbose_name='Категории')
	
	class Meta:
		verbose_name = 'Компания'
		verbose_name_plural = 'Компании'
	
	class Admin:
		list_display = ('title', 'descr', 'address')
		list_filter = ['categories']
		search_fields = ('title', 'descr', 'address')

При редактировании компании в админке в списке (<select>) категорий вместо названий - надписи 'Category object'. Как сделать так, чтобы названия появились?

python-2.4.4-6, django-0.96.1-1 из репозитория debian unstable.
★★★

И вот еще вопрос такой:

Имеется некий класс Profile, в котором определены различные настройки юзера. В нескольких модулях используются кострукции вида:

items = Profile.objects.get(user=request.user).comments_on_page

Как сделать так, чтобы если в профайле нет записи, соответствующей этому юзеру, она автоматически создавалась? try...except использовать не очень хотелось бы, т.к. подобные выборки используются во многих местах, и в каждом месте простую выборку оборачивать в громоздкую конструкцию try...except...profile.save() не очень хочется

friday ★★★
() автор топика
Ответ на: комментарий от friday

Попробовать сделать так:

class Profile (models.Model):
	. . .	
	def __init__(self, user):
		try:
			profile = self.objects.get(user=user)
		except Profile.DoesNotExist:
			profile = Profile(user=user)
			profile.save()

Не вышло. Что я делаю не так?

friday ★★★
() автор топика

Добавь в конце каждого класса:
    def __unicode__(self):
        return self.title
ну или что тебе нужно возвращать, примерно вот так будет:

class Disctypes(models.Model):
    disctype = models.CharField(maxlength=255)
    name = models.CharField(maxlength=255)
    class Admin:
        pass
    def __unicode__(self):
        return self.name

mebius
()
Ответ на: комментарий от friday

>Как сделать так, чтобы если в профайле нет записи, соответствующей этому юзеру, она автоматически создавалась?

class Profile(models.Model):
    user = models.ForeignKey(User, unique=True)
    comments_on_page = models.DateField(blank=True, null=True)
    def save(self): 
        if not self.id:
            self.comments_on_page = 10
        super(Profile, self).save()

Или если бы ты использовал версию из svn
class Profile(models.Model):
    user = models.ForeignKey(User, unique=True)
    comments_on_page = models.DateField(blank=True, null=True, default=10)

http://www.djangoproject.com/documentation/model-api/#default

mebius
()
Ответ на: комментарий от mebius

В последнем сообщении - тип модели укажешь свой, я просто из своей базы взял первое попавшееся и изменил..

mebius
()
Ответ на: комментарий от mebius

В 0.96 default поддерживается. Так и делаю:

class Profile(models.Model):
    comments_on_page =  models.IntegerField('Комментариев на странице', default=20)

Однако, это не совсем в кассу - записи-то все равно не существует, соответственно, значение возвращено не будет.

А если определять save(), тогда запись при вызове save() и будет сохраняться. Мне же нужно немного другое. Мне нужно, чтобы запись создавалась при попытке обращения к ней (т.е. select).

friday ★★★
() автор топика
Ответ на: комментарий от friday

хм... проверил у себя, если указано в модели default - то при регистрации юзера эти поля сами заполняются в базе, а вот как при select это сделать, даже не знаю...

mebius
()
Ответ на: комментарий от mebius

Мы просто немного друг друга недопоняли:-) Все дело в том, что таблиц с профайлами несколько - для каждого модуля своя. Модули могут добавляться /удаляться в любой момент, и юзера в таблице профайла может просто не быть.

friday ★★★
() автор топика

Читайте документацию - там все написано.

1. В версии 0.96 еще не было поддержки Юникода, вам надо использовать не __unicode__, а __str__ (просто замените __repr__ на него)

http://www.djangoproject.com/documentation/0.96/model-api/#str

2. Попробуйте использовать get_or_create

http://www.djangoproject.com/documentation/0.96/models/get_or_create/

anonymous
()
Ответ на: комментарий от anonymous

> 1. В версии 0.96 еще не было поддержки Юникода, вам надо использовать не __unicode__, а __str__ (просто замените __repr__ на него)

__unicode__ работает

> 2. Попробуйте использовать get_or_create

Спасибо, то, что нужно

friday ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.