Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException
вообще.
См. также: A хороший список лучших практик
Я бы добавил, очень важно, хорошо использовать модификатор final
. Использование "окончательной" модификатор, когда это применимо в Java
Сводка:
final
для обеспечения хорошей инициализации. @NotNull
и @Nullable
if("knownObject".equals(unknownObject)
valueOf()
поверх toString (). StringUtils
StringUtils.isEmpty(null)
. С тех пор это стало возможным в Django.
Рассматривали ли вы вместо этого использование CSS, чтобы просто не отображать кнопку? Может быть, это слишком хакерское занятие.
Это не проверено, но я думаю ...
#_addanother { display: none }
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',) }
Вы нигде не получите объяснения им в технических терминах. Вам нужна метафора. По возможности адаптируйте его к человеку, с которым вы разговариваете. Если он / она помешаны на автомобилях, заставьте их задуматься о модификациях двигателя. Сколько будет стоить Ford предложить три разных мотора для Taurus или кастомные модификации по запросу?
Как только они примут это сравнение, даже если они не полностью его поймут, вы сможете начать разбираться , почему эта метафора применима.
Есть еще один отличный способ помочь им увидеть это по-своему. - потратьте немного времени, чтобы увидеть это по-своему. Когда ваша зарплата зависит от того, чтобы дать клиенту то, что он хочет, вам все равно, что вам скажет пропеллер из инженерного дела. Если вы получаете много запросов на настройку,
основывайте свою модель на этом новом классе, переопределите formfield_fo_dbfield
и сделайте так, чтобы он не / или не оборачивал виджет условно в RelatedFieldWidgetWrapper
.
Можно было бы возразить, что если вы есть пользователь, у которого нет прав на добавление связанных объектов, RelatedFieldWidgetWrapper
не должен отображать ссылку добавления? Может быть, это то, что заслуживает упоминания в Django trac ?
RelatedFieldWidgetWrapper
не должен отображать ссылку добавления? Может быть, это то, что заслуживает упоминания в Django trac ? RelatedFieldWidgetWrapper
не должен отображать ссылку добавления? Может быть, это то, что заслуживает упоминания в Django trac ?