Как сделать автозаполненное и автоувеличивающее поле в django администраторе

[Обновление: Измененный заголовок вопроса, чтобы быть более конкретен]

Извините, если я не сделал вопрос очень хорошо, я не могу изобразить, как сделать это:

class WhatEver():
    number = model.IntegerField('Just a Field', default=callablefunction)
...

Где callablefunction делает этот запрос:

from myproject.app.models import WhatEver

def callablefunction():
    no = WhatEver.objects.count()
    return no + 1

Я хочу автоматически записать следующее число, и я не знаю, как сделать это.

У меня есть ошибки от callablefunction заявление, что это не может импортировать модель, и я думаю, что должен быть более легкий способ сделать это. Нет никакой потребности даже для использования этого, но я не могу изобразить, как сделать это с pk числом.

Я погуглил об этом и единственной вещи, которую я нашел, должен был использовать сохранение () метод для автоматического постепенного увеличения числа..., но я хотел показать его в <textfield> перед сохранением...

Что Вы сделали бы?

17
задан Oscar Carballal 26 June 2010 в 14:46
поделиться

3 ответа

Понятно! Надеюсь, это поможет всем, у кого есть проблемы с созданием автоматически заполняемых и автоматически увеличивающихся полей в django. Решение:

class Cliente(models.Model):
    """This is the client data model, it holds all client information. This
       docstring has to be improved."""
    def number():
        no = Cliente.objects.count()
        if no == None:
            return 1
        else:
            return no + 1

    clientcode = models.IntegerField(_('Code'), max_length=6, unique=True, \
    default=number)

    [... here goes the rest of your model ...]

Будьте осторожны:

  • Функция number не принимает никаких аргументов (даже себя)
  • Она написана ДО всего в модели
  • Это было протестировано на django 1.2.1

Эта функция автоматически заполнит поле clientcode следующим числом (т.е. если у вас 132 клиента, когда вы добавите следующий, поле будет заполнен кодом клиента номер 133)

Я знаю, что это абсурд для большинства практических ситуаций, поскольку номер ПК также увеличивается автоматически, но нет возможности автозаполнения или практического использования для это внутри администратора django.

[обновление: как я сказал в своем комментарии, есть способ использовать для этого первичный ключ, но он не заполнит поле до сохранения]

23
ответ дан 30 November 2019 в 11:43
поделиться

У вас есть ошибки в коде, поэтому вы не можете его импортировать:

from django.db import models
class WhatEver(models.Model):
    number = models.IntegerField('Just a Field', default=0)

и Юваль А прав насчет автоинкремента: вам даже не нужно объявлять такие поле . Просто используйте pk или id , они означают то же самое, если в модели нет составного pk:

> w = Whatever(number=10)
> w
<Whatever object>
> w.id
None
> w.save()
> w.id
1

[обновление] Ну, я не пробовал использовать вызываемый объект по умолчанию. Я думаю, если вы исправите эти ошибки, это должно сработать.

0
ответ дан 30 November 2019 в 11:43
поделиться

Каждая модель Django уже имеет автоматически сгенерированный первичный ключ :

id = models.AutoField(primary_key=True)

Похоже, вы пытаетесь дублировать уже существующее поведение, просто используйте первичный ключ объекта.

8
ответ дан 30 November 2019 в 11:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: