Tenho um modelo cadastrado no site de administração. Um de seus campos é uma expressão de string longa. Gostaria de adicionar campos de formulário personalizados à página adicionar / atualizar deste modelo no administrador que, com base nos valores desses campos, construirei a expressão de string longa e a salvarei no campo de modelo relevante.
Como eu posso fazer isso?
ATUALIZAÇÃO: Basicamente, o que estou fazendo é construir uma expressão matemática ou string a partir de símbolos, o usuário escolhe os símbolos (esses são os campos personalizados que não fazem parte do modelo) e quando ele clica em salvar, crio uma representação de expressão string a partir do lista de símbolos e armazená-la no banco de dados. Não quero que os símbolos façam parte do modelo e do DB, apenas a expressão final.
fields = '__all__'
em suaMeta
classe, do contrário django reclama:Creating a ModelForm without either the 'fields' attribute or the 'exclude' attribute is deprecated
YourModelAdmin.list_display[0], 'extra_field' is not a callable or an attribute of 'YourModelAdmin' or found in the model 'YourModel'.
AttributeError: Unable to lookup "extra_field"...
, tente adicionar umlabel
àextra_field
definição. Parece que django tenta "adivinhar" o rótulo dele, olhando paraModel
eModelAdmin
para tal definição de atributo.Unknown field(s) (extra_field) specified for YourModel. Check fields/fieldsets/exclude attributes of class YourModelAdmin.
. A solução para isso éextra_field = forms.CharField(widget=forms.HiddenInput())
É possível fazer no admin, mas não há uma maneira muito direta de fazer isso. Além disso, gostaria de aconselhar a manter a maior parte da lógica de negócios em seus modelos, para que você não dependa do Django Admin.
Talvez seja mais fácil (e talvez até melhor) se você tiver os dois campos separados em seu modelo. Em seguida, adicione um método em seu modelo que os combine.
Por exemplo:
Em seguida, no administrador, você pode adicionar o
combined_fields()
como um campo somente leitura:Se você deseja armazenar o
combined_fields
no banco de dados, você também pode salvá-lo ao salvar o modelo:fonte
save()
método do modelo , verifique as atualizações da minha resposta.Django 2.1.1 A resposta primária me deixou no meio do caminho para responder minha pergunta. Isso não me ajudou a salvar o resultado em um campo do meu modelo real. No meu caso, eu queria um campo de texto no qual um usuário pudesse inserir dados, então, quando um salvamento ocorresse, os dados seriam processados e o resultado colocado em um campo no modelo e salvo. Enquanto a resposta original mostrava como obter o valor do campo extra, ela não mostrava como salvá-lo de volta no modelo pelo menos no Django 2.1.1
Isso pega o valor de um campo personalizado não acoplado, processa e salva no meu campo de descrição real:
fonte
você sempre pode criar um novo modelo de administrador e fazer o que você precisa em seu admin_view (substitua o URL de adição de administrador em seu admin_view):
fonte
Se você absolutamente deseja armazenar apenas o campo combinado no modelo e não os dois campos separados, pode fazer algo assim:
form
atributo em seuModelAdmin
( https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.form )save_formset
método em seuModelAdmin
( https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.save_model )Eu nunca fiz algo assim, então não tenho certeza de como vai funcionar.
fonte