Como posso usar os widgets legais de data e hora do JavaScript que o administrador padrão usa na minha exibição personalizada?
Eu examinei a documentação dos formulários do Django e menciona brevemente django.contrib.admin.widgets, mas não sei como usá-lo?
Aqui está o meu modelo no qual eu quero que ele seja aplicado.
<form action="." method="POST">
<table>
{% for f in form %}
<tr> <td> {{ f.name }}</td> <td>{{ f }}</td> </tr>
{% endfor %}
</table>
<input type="submit" name="submit" value="Add Product">
</form>
Além disso, acho que deve ser observado que eu realmente não escrevi uma visualização para este formulário, estou usando uma visualização genérica. Aqui está a entrada do url.py:
(r'^admin/products/add/$', create_object, {'model': Product, 'post_save_redirect': ''}),
E eu sou relevante para toda a coisa do Django / MVC / MTV, então por favor, vá com calma ...
Respostas:
A crescente complexidade dessa resposta ao longo do tempo, e os muitos hacks necessários, provavelmente devem alertá-lo contra isso. Ele conta com detalhes de implementação interna não documentada do administrador, provavelmente quebrará novamente em versões futuras do Django, e não é mais fácil de implementar do que apenas encontrar outro widget de calendário JS e usá-lo.
Dito isto, eis o que você deve fazer se estiver determinado a fazer isso funcionar:
Defina sua própria subclasse ModelForm para o seu modelo (melhor para colocá-lo em forms.py no seu aplicativo) e diga-lhe para usar o AdminDateWidget / AdminTimeWidget / AdminSplitDateTime (substitua 'mydate' etc. pelos nomes de campo adequados do seu modelo):
Altere seu URLconf para passar 'form_class': ProductForm em vez de 'model': Product para a visualização create_object genérica (que significa "de my_app.forms import ProductForm" em vez de "de my_app.models import Product", é claro).
Na cabeça do seu modelo, inclua {{form.media}} para gerar os links para os arquivos Javascript.
E a parte hacky: os widgets de data / hora do administrador presumem que o material do i18n JS foi carregado e também exigem o core.js, mas não fornecem nenhum dos dois automaticamente. Portanto, no seu modelo acima {{form.media}}, você precisará:
Você também pode usar o seguinte CSS de administrador (obrigado Alex por mencionar isso):
Isso implica que a mídia administrativa do Django (ADMIN_MEDIA_PREFIX) está em / media / admin / - você pode mudar isso para sua configuração. Idealmente, você usaria um processador de contexto para transmitir esses valores ao seu modelo em vez de codificá-lo, mas isso está além do escopo desta pergunta.
Isso também requer que a URL / my_admin / jsi18n / seja conectada manualmente à visualização django.views.i18n.javascript_catalog (ou null_javascript_catalog se você não estiver usando I18N). Você precisa fazer isso sozinho, em vez de acessar o aplicativo de administração, para que fique acessível, independentemente de estar conectado ao administrador (obrigado Jeremy por apontar isso). Código de exemplo para o seu URLconf:
Por fim, se você estiver usando o Django 1.2 ou posterior, precisará de algum código adicional no seu modelo para ajudar os widgets a encontrar sua mídia:
Obrigado lupefiasco por esta adição.
fonte
Como a solução é imprudente, acho que usar seu próprio widget de data / hora com algum JavaScript é mais viável.
fonte
Sim, acabei substituindo o / admin / jsi18n / url.
Aqui está o que eu adicionei em meus urls.py. Verifique se está acima do / admin / url
E aqui está a função i18n_javascript que criei.
fonte
Eu me pego consultando bastante este post e descobri que a documentação define uma maneira um pouco menos invasiva de substituir os widgets padrão.
( Não é necessário substituir o método __init__ do ModelForm )
No entanto, você ainda precisa conectar seu JS e CSS adequadamente, como Carl menciona.
forms.py
Tipos de campos de referência para encontrar os campos de formulário padrão.
fonte
Meu código principal para a versão 1.4 (algumas novas e outras removidas)
fonte
A partir do Django 1.2 RC1, se você estiver usando o truque de seleção de data de administração do Django, o seguinte deverá ser adicionado ao seu modelo ou você verá o URL do ícone do calendário sendo referenciado por "/ missing-admin-media-prefix" / ".
fonte
Complementando a resposta de Carl Meyer, gostaria de comentar que você precisa colocar esse cabeçalho em algum bloco válido (dentro do cabeçalho) dentro do seu modelo.
fonte
Para Django> = 2.0
Etapa 1: adicione o
javascript-catalog
URL aourls.py
arquivo do seu projeto (não do aplicativo) .Etapa 2: adicione os recursos JavaScript / CSS necessários ao seu modelo.
Etapa 3: use os widgets de administrador para os campos de entrada de data e hora no seu
forms.py
.fonte
O abaixo também funcionará como último recurso se o acima falhar
Igual a
coloque isso no seu forms.py
from django.forms.extras.widgets import SelectDateWidget
fonte
Que tal apenas atribuir uma classe ao seu widget e vinculá-la ao datepicker do JQuery?
Django forms.py:
E algum JavaScript para o modelo:
fonte
Solução e solução alternativa atualizadas para SplitDateTime com required = False :
forms.py
form.html
urls.py
fonte
Eu uso isso, é ótimo, mas tenho 2 problemas com o modelo:
E para o TimeField, tenho ' Digite uma data válida. "
models.py
forms.py
fonte
No Django 10. myproject / urls.py: no início de urlpatterns
No meu template.html:
fonte
Minha instalação do Django: 1.11 Bootstrap: 3.3.7
Como nenhuma das respostas é completamente clara, estou compartilhando meu código de modelo que não apresenta nenhum erro.
Metade superior do modelo:
Metade inferior:
fonte
3 de junho de 2020 (todas as respostas não funcionaram, você pode tentar esta solução que eu usei. Apenas para TimeField)
Use
Charfield
campos simples para horário ( início e fim neste exemplo) em formulários.forms.py
nós podemos usar
Form
ouModelForm
aqui.Converter entrada de string em objeto de tempo em visualizações.
fonte