Удалить & ldquo; добавить еще один & rdquo; в админке Django

Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException вообще.

См. также: A хороший список лучших практик

Я бы добавил, очень важно, хорошо использовать модификатор final. Использование "окончательной" модификатор, когда это применимо в Java

Сводка:

  1. Используйте модификатор final для обеспечения хорошей инициализации.
  2. Избегайте возврата null в методы, например, при возврате пустых коллекций.
  3. Использовать аннотации @NotNull и @Nullable
  4. Быстрое завершение работы и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, когда они не должен быть пустым.
  5. Сначала используйте значения с известным объектом: if("knownObject".equals(unknownObject)
  6. Предпочитают valueOf() поверх toString ().
  7. Используйте null safe StringUtils StringUtils.isEmpty(null).

26
задан Jack Ha 12 November 2009 в 09:35
поделиться

2 ответа

УСТАРЕВШИЙ ОТВЕТ

С тех пор это стало возможным в Django.


Рассматривали ли вы вместо этого использование CSS, чтобы просто не отображать кнопку? Может быть, это слишком хакерское занятие.

Это не проверено, но я думаю ...

no-addanother-button.css

#_addanother { display: none }

admin.py

class YourAdmin(admin.ModelAdmin):
    # ...
    class Media:
        # edit this path to wherever
        css = { 'all' : ('css/no-addanother-button.css',) }

Django Doc для этого - Носитель как статическое определение

Примечание / Правка: В документации говорится, что файлы будут добавлены с MEDIA_URL, но в моих экспериментах это не так. Ваш опыт может отличаться.

Если вы обнаружите, что это именно ваш случай, есть быстрое решение для этого ...

class YourAdmin(admin.ModelAdmin):
    # ...
    class Media:
        from django.conf import settings
        media_url = getattr(settings, 'MEDIA_URL', '/media/')
        # edit this path to wherever
        css = { 'all' : (media_url+'css/no-addanother-button.css',) }
4
ответ дан 28 November 2019 в 04:07
поделиться

Вы нигде не получите объяснения им в технических терминах. Вам нужна метафора. По возможности адаптируйте его к человеку, с которым вы разговариваете. Если он / она помешаны на автомобилях, заставьте их задуматься о модификациях двигателя. Сколько будет стоить Ford предложить три разных мотора для Taurus или кастомные модификации по запросу?

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

Есть еще один отличный способ помочь им увидеть это по-своему. - потратьте немного времени, чтобы увидеть это по-своему. Когда ваша зарплата зависит от того, чтобы дать клиенту то, что он хочет, вам все равно, что вам скажет пропеллер из инженерного дела. Если вы получаете много запросов на настройку, основывайте свою модель на этом новом классе, переопределите formfield_fo_dbfield и сделайте так, чтобы он не / или не оборачивал виджет условно в RelatedFieldWidgetWrapper .

Можно было бы возразить, что если вы есть пользователь, у которого нет прав на добавление связанных объектов, RelatedFieldWidgetWrapper не должен отображать ссылку добавления? Может быть, это то, что заслуживает упоминания в Django trac ?

RelatedFieldWidgetWrapper не должен отображать ссылку добавления? Может быть, это то, что заслуживает упоминания в Django trac ?

RelatedFieldWidgetWrapper не должен отображать ссылку добавления? Может быть, это то, что заслуживает упоминания в Django trac ?

6
ответ дан 28 November 2019 в 04:07
поделиться
Другие вопросы по тегам:

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