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.

0
Omar Gonzales 19 Desember 2017, 22:52
1
Dalam pertanyaan Anda, Anda mengatakan bahwa Anda ingin elemen navbar hadir di semua templat. Apa hubungannya dengan prosesor konteks?
 – 
schrodigerscatcuriosity
19 Desember 2017, 23:01
"Di urls.py saya, dari url mana Tampilan ini harus dipanggil?" Anda dapat mengatur url apa pun yang Anda inginkan, selama Anda melewati tampilan. seperti pada url(r'^any-url-i-want/$', RegistroClienteView.as_view(), name='any-name-i-want'),
 – 
schrodigerscatcuriosity
19 Desember 2017, 23:05
Di navbar adalah formulir login/daftar. Seperti yang akan ada di halaman yang berbeda, saya ingin memanggil tampilan saya di 'base'.html' sekali untuk selamanya.
 – 
Omar Gonzales
19 Desember 2017, 23:10
@guillermochamorro, tolong, lihat pertanyaan yang diperbarui. Bisakah Anda menjelaskan itu? Ti.
 – 
Omar Gonzales
19 Desember 2017, 23:15

2 jawaban

Anda harus mengganti return context dengan return render(request, 'PATH/TEMPLATE.html', context).

Ini juga menyelesaikan pertanyaan Anda template mana yang dirender :-)

2
porton 19 Desember 2017, 23:18
Tapi itu akan menjadi template yang berbeda. Jadi, saya tidak ingin membuat hardcode satu pun 'PATH/TEMPLATE.html'. Apakah ada cara untuk melakukannya?
 – 
Omar Gonzales
19 Desember 2017, 23:38

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'),
0
schrodigerscatcuriosity 19 Desember 2017, 23:26
Tapi itu akan menjadi template yang berbeda. Jadi, saya tidak ingin membuat hardcode satu pun 'PATH/TEMPLATE.html'. Apakah ada cara untuk melakukannya? Atau satu-satunya cara adalah membuat Tampilan untuk setiap halaman yang memuat navbar dengan formulir?
 – 
Omar Gonzales
19 Desember 2017, 23:39
Saya menyadari bahwa Anda ingin membuat seluruh tampilan dalam prosesor konteks Anda. Anda tidak perlu melakukan itu. Pertama, prosesor konteks mengambil sebagai argumen 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'.
 – 
schrodigerscatcuriosity
19 Desember 2017, 23:54
Pandangan Anda tersedia di mana-mana selama Anda memiliki url yang mengarah ke sana. Pemroses konteks adalah untuk memiliki akses ke bagian data tertentu di seluruh template apa pun.
 – 
schrodigerscatcuriosity
20 Desember 2017, 00:03