Как сделать автозаполнение и автоинкрементное поле в django admin - PullRequest
17 голосов
/ 26 июня 2010

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

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

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 о том, что он не может импортировать модель, и я думаю, что должен быть более простой способ сделать это. Нет необходимости даже использовать это, но я не могу понять, как это сделать с номером ПК.

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

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

Ответы [ 4 ]

22 голосов
/ 26 июня 2010

Понятно! Надеюсь, это поможет всем, у кого возникли проблемы с заполнением автоматически заполненного и автоматически увеличивающегося поля в 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 клиента, при добавлении следующего поле будет заполнено clientcode число 133)

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

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

7 голосов
/ 26 июня 2010

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

id = models.AutoField(primary_key=True)

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

6 голосов
/ 12 апреля 2014

Я тоже сталкивался с этой проблемой, мой экземпляр этого был customer.number, который был относительно клиентов Store.У меня было соблазн использовать что-то вроде:

# Don't do this:

class Customer(models.Model):
    # store = ...
    number = models.IntegerField(default=0)

    def save(self, *args, **kwargs):
        if self.number == 0:
            try:
                self.number = self.store.customer_set.count() + 1
            else:
                self.number = 1
        super(Customer, self).save(*args, **kwargs)

Выше может вызвать несколько проблем: Скажем, было 10 клиентов, и я удалил номер клиента 6. Следующий клиент, который будет добавлен, будетбыть (казалось бы) 10-м клиентом, который затем станет вторым клиентом № 10.(Это может привести к большим ошибкам в get() наборах запросов)

То, что я закончил, было примерно таким:

class Store(models.Model):
    customer_number = models.IntegerField(default=1)

class Customer(models.Model):
    store = models.ForeignKey(Store)
    number = models.IntegerField(default=0)

    def save(self, *args, **kwargs):
        if self.number == 0:
            self.number = self.store.customer_number
            self.store.number += 1
            self.store.save()
        super(Customer, self).save(*args, **kwargs)

PS:

Вы несколько раз выкинули, чтоВы хотели, чтобы это поле было заполнено " до ".Я предполагаю, что вы хотели заполнить его перед сохранением, чтобы иметь к нему доступ.На это я бы сказал: этот метод позволяет вам получить доступ к store.customer_number, чтобы увидеть следующий номер.

0 голосов
/ 26 июня 2010

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...