Saya memiliki item bilah navigasi yang digunakan untuk mendaftar/masuk. Karena, itu akan berada di halaman yang berbeda, saya berpikir untuk memanggil formulir ini "sekali" untuk setiap halaman, di 'base.html'.
Saya telah menemukan tentang 'pemroses konteks' (Django - Bagaimana cara membuat variabel tersedia untuk semua template?), namun, seperti yang saya lihat, variabel tersebut hanya meneruskan variabel ke semua template, dalam suatu fungsi (Tidak menggunakan Tampilan kelas, dengan metode get dan post).
Untuk itu, ia menggunakan fungsi seperti ini pada file:
view.py:
def categories_processor(request):
categories = Category.objects.all()
return {'categories': categories}
Namun, saya menggunakan Tampilan Kelas di views.py saya, dan, secara umum, saya lulus 'permintaan', 'url yang akan dirender', 'konteks'. Seperti ini:
view.py:
class RegistroClienteView(View):
def get(self, request):
ls_tipos_de_documento = TipoDocumento.objects.values_list('id', 'nombre_corto')
form = ClienteCreationForm()
context = {'form': form, 'ls_tipos_de_documento': ls_tipos_de_documento}
return render(request, 'app_cliente/frontend/ingreso.html', context)
def post(self, request):
ls_tipos_de_documento = TipoDocumento.objects.values_list('id', 'nombre_corto')
form = ClienteCreationForm(request.POST)
if form.is_valid():
form.save()
context = {'form': form}
return render(request, 'app_cliente/frontend/ingreso.html', context)
context = {'form': form, 'ls_tipos_de_documento': ls_tipos_de_documento}
return render(request, 'app_cliente/frontend/ingreso.html', context)
Pertanyaan saya adalah apa yang harus dikembalikan dalam Tampilan?
Setelah mengikuti langkah-langkah untuk menyiapkan 'context-processor.py', dalam file ini, saya memiliki:
Jalur: app_cliente/context-processor.py
Berkas: context-processor.py:
Tolong, perhatikan bahwa saya hanya mengembalikan konteksnya
from app_cliente.forms import ClienteCreationForm
from django.views import View
from nucleo.models.tipo_documento import TipoDocumento
class RegistroClienteView(View):
def get(self, request):
ls_tipos_de_documento = TipoDocumento.objects.values_list('id', 'nombre_corto')
form = ClienteCreationForm()
context = {'form': form, 'ls_tipos_de_documento': ls_tipos_de_documento}
return context
def post(self, request):
ls_tipos_de_documento = TipoDocumento.objects.values_list('id', 'nombre_corto')
form = ClienteCreationForm(request.POST)
if form.is_valid():
form.save()
context = {'form': form}
return context
context = {'form': form, 'ls_tipos_de_documento': ls_tipos_de_documento}
return context
Pertanyaan:
Di urls.py saya, dari url mana Tampilan ini harus dipanggil?
Apakah ini pendekatan yang benar?
PEMBARUAN 1:
Biarkan saya mengklarifikasi pertanyaan saya menggunakan contoh ini yang diposting di komentar:
url(r'^any-url-i-want/$', RegistroClienteView.as_view(), name='any-name-i-want'),
Di sini, RegistroClienteView.as_view()
akan merender template mana??? Ingat bahwa itu hanya mengembalikan konteks dalam file context_processor.py
.
2 jawaban
Anda harus mengganti return context
dengan return render(request, 'PATH/TEMPLATE.html', context)
.
Ini juga menyelesaikan pertanyaan Anda template mana yang dirender :-)
Untuk memiliki template navbar di base.html Anda, buat templates/myapp/navbar.html
lalu di . Anda
base.html
...
include('myapp/navbar.html')
...
Jika Anda ingin menunjukkan nama pengguna, Anda dapat menambahkan navbar.html
Anda
{% if request.user.is_authenticated %}
{{ request.user.username }}
{% endif %}
Jika Anda ingin menambahkan data lain ke navbar Anda, gunakan pemroses konteks.
Gunakan TemplateView
dalam tampilan Anda untuk menentukan template mana yang akan digunakan:
from django.views.generic import TemplateView
class RegistroClienteView(TemplateView):
template_name = 'myapp/my_template.html'
...
Akhirnya seperti yang dinyatakan dalam komentar saya:
Anda dapat mengatur url apa pun yang Anda inginkan, selama Anda melewati tampilan. seperti dalam
url(r'^any-url-i-want/$', RegistroClienteView.as_view(), name='any-name-i-want'),
request
, bukan View
. Jika Anda memiliki Templat formulir di basis Anda, formulir dirender pada setiap tampilan. Yang Anda ubah adalah url yang ditunjuk oleh template Anda. Jadi di base.html Anda, Anda memiliki formulir login yang menunjuk ke url 'login'
Anda, dan formulir pendaftaran (ingat, formulir yang diberikan di setiap tampilan) yang menunjuk ke url 'register'.
url(r'^any-url-i-want/$', RegistroClienteView.as_view(), name='any-name-i-want'),