Giter Site home page Giter Site logo

codloom / djangoprojeto3-immobile Goto Github PK

View Code? Open in Web Editor NEW
10.0 0.0 1.0 1.66 MB

Um projeto aleatório do Workana. Vamos criar um projeto Sistema de Controle de Aluguéis.

Python 58.35% CSS 0.73% HTML 40.93%
boostrap5 django html-css-javascript python

djangoprojeto3-immobile's Introduction

Freela do Workana

Controle de Aluguéis

w2.png

Desenvolver um sistema que permita o controle de aluguéis de imóveis em uma imobiliária.

Fluxo

core.png

  • Cadastro de imóveis: Código, Tipo, endereço e Valor

  • Tipos: APARTAMENTO, KITNET e CASA

  • Lista imóveis por tipo Na homepage e colocar Filtro por tipo.

  • Cadastro de Clientes: Nome, e-mail e Telefone

  • Registrar de Locação: Cliente, Imóvel, Período (Inicio e Término)

  • Relatório de Imóveis Locados.

  • Layout Bootstrap HTML/CSS/JS

  • Banco de Dados (Sqlite3)

Vídeo de como configurar Projeto:

Repositório: https://github.com/djangomy/config-default-simple.git

Eu clonei o repositório !!!

Depois de feito as configurações iniciais e executado o projeto.

Vamos para criação do nosso modelo e estrutura do projeto.

Pack de imagens q vou utilizar no vídeo.

  • Imagens pegar do repositório

Vamos lá.

Criar Modelo
  • Criar Modelo

    myapp/models.py

    -- Cadastro de Clientes

    ## Cadastro de Clientes     
    class Client(models.Model):
        name = models.CharField(max_length=100)
        email = models.EmailField(max_length=200)
        phone = models.CharField(max_length=15)
        
        def __str__(self):
            return "{} - {}".format(self.name, self.email)
        
        class Meta:
            verbose_name = 'Cliente'
            verbose_name_plural = 'Clientes'
            ordering = ['-id']

    -- Cadastro de Imóveis

    ## Opções de Imóveis
    class TypeImmobile(models.TextChoices):
        APARTMENT = 'APARTAMENTO','APARTAMENTO'
        KITNET = 'KITNET','KITNET'
        HOUSE = 'CASA','CASA'
    
    ## Cadastro de Imóveis
    class Immobile(models.Model):
        code = models.CharField(max_length=100)
        type_item = models.CharField(max_length=100, choices=TypeImmobile.choices)
        address = models.TextField()
        price = models.DecimalField(max_digits=10,decimal_places=2)
        is_locate = models.BooleanField(default=False)
        
        
        def __str__(self):
            return "{} - {}".format(self.code, self.type_item)
        
        class Meta:
            verbose_name = 'Imóvel'
            verbose_name_plural = 'Imóveis'
            ordering = ['-id']
    ## Cadastrar as Imagens do Imóvel
    class ImmobileImage(models.Model):
        image = models.ImageField('Images',upload_to='images')
        immobile = models.ForeignKey(Immobile, related_name='immobile_images', on_delete=models.CASCADE)
        
        def __str__(self):
            return self.immobile.code

    -- Registrar Locação

    ## Registrar Locação
    class RegisterLocation(models.Model):
            immobile = models.ForeignKey(Immobile, on_delete=models.CASCADE, related_name='reg_location')
        client = models.ForeignKey(Client, on_delete=models.CASCADE)
        dt_start = models.DateTimeField('Inicio')
        dt_end = models.DateTimeField('Fim')
        create_at = models.DateField(default=datetime.now, blank=True)
        
        def __str__(self):
            return "{} - {}".format(self.client, self.immobile)
        
        class Meta:
            verbose_name = 'Registrar Locação'
            verbose_name_plural = 'Registrar Locação'
            ordering = ['-id']

    admin.py

    class ImmobileImageInlineAdmin(admin.TabularInline):
        model = models.ImmobileImage
        extra = 0
    
    class ImmobileAdmin(admin.ModelAdmin):
        inlines = [ImmobileImageInlineAdmin]
    
    admin.site.register(models.Immobile, ImmobileAdmin)
Listar Imóveis
  • Listar Imóveis

    myapp/views.py

    def list_location(request):
    	 immobiles = Immobile.objects.filter(is_locate=False)
    	 context = {
            'immobiles': immobiles
        }
        return render(request, 'list-location.html', context)

    myapp/urls.py

    from django.urls import path 
    from myapp import views
    
    urlpatterns = [
        path('', views.list_location, name='list-location'),
     ]

    myapp/templates/list-location.html

    {% extends 'base.html' %}
    
    {% block title %}Lista de Locações{% endblock %}
    
    {% block content %} 
     
    <div class="container">
        <div class="cards">
            {% for immobile in immobiles %}  
            <div class="card-item h-100"> 
    			 			{% for el in immobile.immobile_images.all %}
                {% if forloop.first %}
                <img src="{{el.image.url}}" class="card-image"  width="100%" height="320" alt="{{el.id}}"> 
                {% endif %}  
                {% endfor %}   
                <div class="card-body p-3">
                    <p>Codígo: {{immobile.code}}</p> 
                    <p>Endereço: {{immobile.address}}</p>
                    <p>Valor: {{immobile.price}}</p>   
                    <div class="d-flex justify-content-between align-items-center">
                        <div class="badge bg-success">Tipo: {{immobile.type_item}}</div> 
                    </div>
                </div>  
            </div> 
            {% endfor %} 
        </div>
    </div>
    {% endblock %}

    base/static/css/style.css

    Utilizando Flexbox para os cards na homepage.

    .cards {
        display: flex;
        flex-wrap: wrap;
        align-items: stretch;
    }
     
    .card-item {
        flex: 0 0 25rem;
        box-sizing: border-box;
        margin: 1rem 0.25em;
        border-radius: 10px;
        border: 1px solid;
    }
    
    .card-image {
        border-radius: 10px;
    }

    Card Slide de Imagens

    <div class="card-image"> 
    	<div id="carouselIndicators{{immobile.id}}" class="carousel slide" data-bs-ride="false"> 
    		<div class="carousel-indicators">
    			{% for el in immobile.immobile_images.all %} 
    			{% if forloop.first %}
    			<button type="button" data-bs-target="#carouselIndicators{{immobile.id}}" data-bs-slide-to="{{forloop.counter0}}" class="active" aria-current="true" aria-label="Slide {{forloop.counter0}}"></button>
    			{% else %} 
    			<button type="button" data-bs-target="#carouselIndicators{{immobile.id}}" data-bs-slide-to="{{forloop.counter0}}" aria-label="Slide {{forloop.counter0}}"></button>
    			{% endif %}  
    			{% endfor %}  
    		</div> 
    		<div class="carousel-inner">
    			{% for el in immobile.immobile_images.all %}
    	 		<div class="carousel-item {% if forloop.first %}active{% endif %}">
    				<img src="{{el.image.url}}" class="card-image"  width="100%" height="320" alt="{{el.id}}">
    			</div>
    			{% endfor %}
    		</div>
    		<button class="carousel-control-prev" type="button" data-bs-target="#carouselIndicators{{immobile.id}}" data-bs-slide="prev">
    			<span class="carousel-control-prev-icon" aria-hidden="true"></span>
    			<span class="visually-hidden">Previous</span>
    		</button>
    		<button class="carousel-control-next" type="button" data-bs-target="#carouselIndicators{{immobile.id}}" data-bs-slide="next">
    			<span class="carousel-control-next-icon" aria-hidden="true"></span>
    			<span class="visually-hidden">Next</span>
    		</button>
    	</div>
    </div>
Formulário Cliente
  • Formulário Cliente

    myapp/forms.py

    ## Cadastra Cliente          
    class ClientForm(forms.ModelForm):
        class Meta:
            model = Client
            fields = '__all__'
            
        def __init__(self, *args, **kwargs): # Adiciona 
            super().__init__(*args, **kwargs)  
            for field_name, field in self.fields.items():   
                  field.widget.attrs['class'] = 'form-control'

    myapp/views.py

    def form_client(request):
        form = ClientForm() 
        if request.method == 'POST':
            form = ClientForm(request.POST)
            if form.is_valid():
                form.save()
                return redirect('list-location')   
        return render(request, 'form-client.html', {'form': form})

    myapp/urls.py

    from django.urls import path 
    from myapp import views
    
    urlpatterns = [
        path('', views.list_location, name='list-location'), 
        path('form-client/', views.form_client, name='client-create'), 
    ]

    myapp/templates/form-client.html

    {% extends 'base.html' %} 
    
    {% block title %}Cadastrar Cliente{% endblock %}
    
    {% load static %}
    
    {% block content %}
    <div class="container"> 
        <div class="d-flex gap-4 mt-3">
     
            <img src="{% static 'images/client.jpg' %}" class="card-image" width="100%" height="500" alt="client">
      
            <form class="col-md-4" action="{% url 'client-create' %}" method="post">
                {% csrf_token %}
                <h3>Cadastrar Cliente</h3>
                {% for field in form %}
                <div class="mt-3">
                    {{field.label}}
                    {{field}}
                </div>
                {% endfor %}
                <input type="submit" class="btn btn-primary mt-3" value="Salvar">
            </form>
            
        </div> 
    </div>
    {% endblock %}
Formulário Imóvel
  • Formulário Imóvel

    myapp/forms.py

    class MultipleFileInput(forms.ClearableFileInput):
      allow_multiple_selected = True
    
    class MultipleFileField(forms.FileField):
        def __init__(self, *args, **kwargs):
            kwargs.setdefault("widget", MultipleFileInput())
            super().__init__(*args, **kwargs)
    
        def clean(self, data, initial=None):
            single_file_clean = super().clean
            if isinstance(data, (list, tuple)):
                result = [single_file_clean(d, initial) for d in data]
            else:
                result = single_file_clean(data, initial)
            return result
    
    ## Cadastra um Imovel
    class ImmobileForm(forms.ModelForm):
        immobile = MultipleFileField()
        class Meta:
            model = Immobile
            fields = '__all__'
            exclude = ('is_locate',)
            
        def __init__(self, *args, **kwargs): # Adiciona 
            super().__init__(*args, **kwargs)  
            for field_name, field in self.fields.items():   
                if field.widget.__class__ in [forms.CheckboxInput, forms.RadioSelect]:
                    field.widget.attrs['class'] = 'form-check-input'
                else:
                    field.widget.attrs['class'] = 'form-control'

    myapp/views.py

    def form_immobile(request):
        form = ImmobileForm()
        if request.method == 'POST':
            form = ImmobileForm(request.POST, request.FILES)
            if form.is_valid():
                immobile = form.save()
                files = request.FILES.getlist('immobile') ## pega todas as imagens
                if files:
                    for f in files:
                        ImmobileImage.objects.create( # cria instance para imagens
                            immobile=immobile, 
                            image=f)
                return redirect('list-location')  
        return render(request, 'form-immobile.html', {'form': form})

    myapp/urls.py

    from django.urls import path 
    from myapp import views
    
    urlpatterns = [
        path('', views.list_location, name='list-location'), 
        path('form-client/', views.form_client, name='client-create'), 
        path('form-immobile/', views.form_immobile, name='immobile-create'),  
    ]

    myapp/templates/form-immobile.html

    {% extends 'base.html' %}
    
    {% block title %}Cadastrar Imóvel{% endblock %}
    
    {% load static %}
    
    {% block content %}
    <div class="container">
    
        <div class="d-flex gap-4 mt-3"> 
    			
            <img src="{% static 'images/imovel.png' %}" class="card-image" width="100%" height="500" alt="client"> 
            
            <form class="col-md-6" action="{% url 'immobile-create' %}" method="post" 
                enctype="multipart/form-data">
                {% csrf_token %} 
                <h3>Cadastrar Imóvel</h3>
                {% for field in form %}
                <div class="mt-3">
                    {{field.label}}
                    {{field}}
                </div>
                {% endfor %} 
                <input type="submit" class="btn btn-primary mt-3" value="Salvar">
            </form>
    
        </div>
     
    </div>
    {% endblock %}
Formulário Registro de Locação
  • Formulário Registro de Locação

    myapp/forms.py

    ## Registra Locação do Imovel    
    class RegisterLocationForm(forms.ModelForm):
        dt_start = forms.DateTimeField(widget=forms.DateInput(format='%d-%m-%Y',attrs={'type': 'date',}))
        dt_end = forms.DateTimeField(widget=forms.DateInput(format='%d-%m-%Y',attrs={'type': 'date',}))
    
        class Meta:
            model = RegisterLocation
            fields = '__all__'
            exclude = ('immobile','create_at',)
            
        def __init__(self, *args, **kwargs): # Adiciona 
            super().__init__(*args, **kwargs)  
            for field_name, field in self.fields.items():   
                  field.widget.attrs['class'] = 'form-control'

    myapp/views.py

    Vamos Registar uma locação a partir de um objeto. No caso o Imóvel.

    def form_location(request, id):
        get_locate = Immobile.objects.get(id=id) ## pega objeto
        form = RegisterLocationForm()  
        if request.method == 'POST':
            form = RegisterLocationForm(request.POST)
            if form.is_valid():
                location_form = form.save(commit=False)
                location_form.immobile = get_locate ## salva id do imovel 
                location_form.save() 
    						## muda status do imovel para "Alugado" ???
                return redirect('list-location') # Retorna para lista
        context = {'form': form, 'location': get_locate}
        return render(request, 'form-location.html', context)

    Mudar o Status do Imóvel como Já Locado. O campo is_locate para a ser True.

    ## muda status do imovel para "Alugado"
    immo = Immobile.objects.get(id=id)
    immo.is_locate = True ## passa ser True
    immo.save() 

    myapp/urls.py

    from django.urls import path 
    from myapp import views
    
    urlpatterns = [
        path('', views.list_location, name='list-location'), 
        path('form-client/', views.form_client, name='client-create'), 
        path('form-immobile/', views.form_immobile, name='immobile-create'), 
        path('form-location/<int:id>/', views.form_location, name='location-create'), 
    ]

    myapp/templates/form-location.html

    {% extends 'base.html' %}
    
    {% block title %}Cadastrar Locação{% endblock %}
    
    {% block content %}
    <div class="container"> 
        <div class="d-flex gap-4 mt-4">  
    
    				<!-- Informções do Objeto Here --> 
    
            <form class="col-md-4" action="{% url 'location-create' location.id %}" method="post">
                {% csrf_token %}
                <h3>Formulário de Registro Locação</h3>
                {% for field in form %}
                <div class="mt-3">
                    {{field.label}}
                    {{field}}
                </div>
                {% endfor %}
                <input type="submit" class="btn btn-primary mt-3" value="Locar">
            </form> 
        </div> 
    </div>
    {% endblock %}

    Como temos um context location para objeto podemos colocar algumas informações no templates.

    <!-- Informções do Objeto Here --> 
    <div class="">
    	  <div id="carouselExampleControls" class="carousel slide" data-bs-ride="false">
    	      <div class="carousel-inner">
    	          {% for el in location.immobile_images.all %}
    	          <div class="carousel-item {% if forloop.first %}active{% endif %}">
    	             <img src="{{el.image.url}}" class="card-image" width="100%" height="500" alt="{{el.id}}">
    	          </div>
    	          {% endfor %}
    	      </div>
    	      <button class="carousel-control-prev" type="button" data-bs-target="#carouselExampleControls" data-bs-slide="prev">
    	          <span class="carousel-control-prev-icon" aria-hidden="true"></span>
    	          <span class="visually-hidden">Previous</span>
    	      </button>
    	      <button class="carousel-control-next" type="button" data-bs-target="#carouselExampleControls" data-bs-slide="next">
    	          <span class="carousel-control-next-icon" aria-hidden="true"></span>
    	          <span class="visually-hidden">Next</span>
    	      </button>
    	  </div>
    	
    	  <div class="mt-3">
    	      <p>Codígo: {{location.code}}</p>
    	      <p>Endereço: {{location.address}}</p>
    	      <p>Valor: {{location.price}}</p>
    	      <div class="badge bg-success">Tipo: {{location.type_item}}</div> 
    	  </div> 
    
    </div>
            
Navbar
  • Navbar

    navbar.html

    <nav class="navbar navbar-expand-lg navbar-dark bg-dark">
    
        <div class="container-fluid">
    
            <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarTogglerDemo03" aria-controls="navbarTogglerDemo03" aria-expanded="false" aria-label="Toggle navigation">
                <span class="navbar-toggler-icon"></span>
            </button>
    
            <a class="navbar-brand" href="#">Myapp</a>
    
            <div class="collapse navbar-collapse" id="navbarTogglerDemo03">
    
                <ul class="navbar-nav gap-3 mb-2 mb-lg-0 mx-auto">
    
                    <li class="nav-item">
                        <a class="nav-link active" aria-current="page" href="/">Inicio</a>
                    </li>
    
                    <li class="nav-item">
                        <a class="nav-link" href="/">Relatório</a>
                    </li>
    
                    <li class="nav-item dropdown">
                        <a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">
                            Cadastrar
                        </a>
                        <ul class="dropdown-menu dropdown-menu-dark">
                            <li>
                                <a class="dropdown-item" href="{% url 'client-create' %}">Cliente</a>
                            </li>
                            <li>
                                <hr class="dropdown-divider">
                            </li>
                            <li>
                                <a class="dropdown-item" href="{% url 'immobile-create' %}">Imóvel</a>
                            </li>
                        </ul>
                    </li> 
                </ul>
    
                <a class="navbar-brand" href="#">@eticialima</a> 
    
            </div>
    
        </div>
    
    </nav>
Message
  • Message

    message.html

    {% if messages %}
    <div class="messages">
        {% for message in messages %}
        <div {% if message.tags %} class="alert {{ message.tags }}"{% endif %} role="alert">{{ message }}</div>
        {% endfor %}
    </div>
    {% endif %}

    core/settings.py

    # --- Messages --- #
    from django.contrib.messages import constants
    
    MESSAGE_TAGS = {
    	constants.ERROR: 'alert-danger',
    	constants.WARNING: 'alert-warning',
    	constants.DEBUG: 'alert-danger',
    	constants.SUCCESS: 'alert-success',
    	constants.INFO: 'alert-info',
    }
Relatório Simples
  • Relatório Simples

    myapp/views.py

    def reports(request): ## Relatórios   
        immobile = Immobile.objects.all()  
        return render(request, 'reports.html', {'immobiles':immobile})

    myapp/urls.py

    from django.urls import path 
    from myapp import views
    
    urlpatterns = [
        ...
        path('reports/', views.reports, name='reports'),
    		...
     ]

    myapp/templates/reports.html Esses 3 campos está em uma tabela relacionada. Então para chamar essas informações de outra tabela estou fazendo um for immobile.reg_location.all , para obter as informações dos registros de Locação Relacionados com a tabela de Imóveis.

    <td scope="row">{% for location in immobile.reg_location.all %}{{location.dt_start|date:"d/m/Y"}}{% endfor %}</td>
    <td scope="row">{% for location in immobile.reg_location.all %}{{location.dt_end|date:"d/m/Y"}}{% endfor %}</td>
    <td scope="row">{% for location in immobile.reg_location.all %}{{location.client}}{% endfor %}</td>
    {% extends 'base.html' %}
    
    {% block title %}Relatório{% endblock %}
    
    {% block content %}
    
    <div class="container"> 
    
        <!-- Tabela com todas informações de Registro de Locação -->
        <table class="table">
            <thead>
                <tr>
                    <th scope="col">#</th>
                    <th scope="col">Registro Inicial</th>
                    <th scope="col">Registro Final</th>
                    <th scope="col">Cliente</th>
                    <th scope="col">Codigo</th>
                    <th scope="col">Imovel</th>
                    <th scope="col">Valor</th>
                    <th scope="col">Locado</th>
                </tr>
            </thead>
            <tbody>
                {% for immobile in immobiles %}
                <tr>
                    <td scope="row">{{immobile.id}}</td>
    
                    <td scope="row">{% for location in immobile.reg_location.all %}{{location.dt_start|date:"d/m/Y"}}{% endfor %}</td>
                    <td scope="row">{% for location in immobile.reg_location.all %}{{location.dt_end|date:"d/m/Y"}}{% endfor %}</td>
                    <td scope="row">{% for location in immobile.reg_location.all %}{{location.client}}{% endfor %}</td>
    
                    <td scope="row">{{immobile.code}}</td>
                    <td scope="row">{{immobile.type_item}}</td>
                    <td scope="row">R$ {{immobile.price}}</td>
    
                    <td scope="row">
                        {% if immobile.is_locate == True %}
                        <i class="fas fa-check-circle fa-2x link-success"></i>
                        {% else %}
                        <i class="fas fa-minus-circle fa-2x link-danger"></i>
                        {% endif %} 
                    </td>
    
                </tr>  
                {% endfor %}
            </tbody>
        </table> 
    </div>
    
    {% endblock %}

    Outro detalhe adicionar a Tag do Font Awesome. Para aparecer os icones que coloquei na tabela acima.

    <!-- CSS -->
    <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.15.4/css/all.css" integrity="sha384-DyZ88mC6Up2uqS4h/KRgHuoeGwBcD4Ng9SiP4dIRy0EXTlnuz47vAwmeGwVChigm" crossorigin="anonymous"/>

    Filtrar pelo status do imóvel se está locado ou não locado

    def reports(request): ## Relatórios   
        immobile = Immobile.objects.all()
        is_locate = request.GET.get('is_locate') 
        if is_locate: ## Imovel foi locado ou não
            immobile = Immobile.objects.filter(is_locate=is_locate) 
        return render(request, 'reports.html', {'immobiles':immobile})
    <div class="row g-3 align-items-center m-3 bg-light p-3"> 
        <!-- Filtrar pelo status do imóvel se está locado ou não locado -->
        <div class="col-auto">
            <form action="{% url 'reports' %}">
                <label>Status Locação</label>
                <select name="is_locate" class="form-select" onchange="this.form.submit()">
                    <option></option> 
                    <option value="True" {% if request.GET.is_locate == 'True' %}selected{% endif %}>LOCADO</option>
                    <option value="False" {% if request.GET.is_locate == 'False' %}selected{% endif %}>NÃO LOCADO</option> 
                </select>
            </form>
        </div>
    
        <!-- Resetar estado dos filtros -->
        <div class="col-auto"> 
            <a class="btn btn-danger" href="{% url 'reports' %}"><i class="fas fa-window-close"></i></a>
        </div>  
    </div>
Filtros
  • Filtros

    Filter pelo tipo de imóvel

    def reports(request): ## Relatórios   
        immobile = Immobile.objects.all()  
        type_item = request.GET.get('type_item')
        is_locate = request.GET.get('is_locate') 
        if type_item: ## Tipo de Imovel
            immobile = Immobile.objects.filter(type_item=type_item) 
        if is_locate: ## Imovel foi locado ou não
            immobile = Immobile.objects.filter(is_locate=is_locate) 
        return render(request, 'reports.html', {'immobiles':immobile})
    <!-- Filter pelo tipo de imóvel -->
    <div class="col-auto">
        <form class="" action="{% url 'reports' %}">
           <label>Tipo de Imóvel</label>
            <select name="type_item" class="form-select" onchange="this.form.submit()">
                <option></option> 
                <option value="APARTAMENTO" {% if request.GET.type_item == 'APARTAMENTO' %}selected{% endif %}>APARTAMENTO</option>
                <option value="KITNET" {% if request.GET.type_item == 'KITNET' %}selected{% endif %}>KITNET</option>
                <option value="CASA" {% if request.GET.type_item == 'CASA' %}selected{% endif %}>CASA</option>
            </select>
        </form> 
    </div>

    Pesquisar pelo nome ou e-mail do cliente

    Vamos utilizar essa biblioteca para filtros mais complexo. Nesse caso vamos usar apenas 2 parâmetros para filtrar Nome do cliente ou E-mail.

    from django.db.models import Q

    Nota que estamos filtrando pela tabela Immobile E o campo client pertence a tabela RegisterLocation que é uma foreignkey. Bom para filtrar vamos usar o related_name que é reg_location.

    def reports(request): ## Relatórios   
        immobile = Immobile.objects.all() 
        client = request.GET.get('client') 
        type_item = request.GET.get('type_item')
        is_locate = request.GET.get('is_locate')
    
        if client: ## Filtra por nome e email do cliente
            immobile = Immobile.objects.filter(
    					Q(reg_location__client__name__icontains=client) | 
    					Q(reg_location__client__email__icontains=client))
    
        if type_item: ## Tipo de Imovel
            immobile = Immobile.objects.filter(type_item=type_item) 
        if is_locate: ## Imovel foi locado ou não
            immobile = Immobile.objects.filter(is_locate=is_locate) 
        return render(request, 'reports.html', {'immobiles':immobile})
    <!-- Pesquisar pelo nome ou e-mail do cliente -->
    <div class="col-auto">  
        <label>Nome do Cliente ou E-mail</label>
        <form class="d-flex" action="{% url 'reports' %}">
            <input name="client" type="search" class="form-control me-2" placeholder="Pesquisar por cliente..." aria-label="Search">
            <button class="btn btn-success" type="submit"><i class="fas fa-search"></i></button>
        </form> 
    </div>

    Filter por Intervalo de data

    def reports(request): ## Relatórios   
        immobile = Immobile.objects.all() 
        client = request.GET.get('client')
        dt_start = request.GET.get('dt_start')
        dt_end = request.GET.get('dt_end')
        type_item = request.GET.get('type_item')
        is_locate = request.GET.get('is_locate')
        if client: ## Filtra por nome e email do cliente
            immobile = Immobile.objects.filter(Q(reg_location__client__name__icontains=client) | Q(reg_location__client__email__icontains=client))
        if dt_start and dt_end: ## Por data
            immobile = Immobile.objects.filter(
    						reg_location__create_at__range=[dt_start,dt_end])
        if type_item: ## Tipo de Imovel
            immobile = Immobile.objects.filter(type_item=type_item) 
        if is_locate: ## Imovel foi locado ou não
            immobile = Immobile.objects.filter(is_locate=is_locate) 
        return render(request, 'reports.html', {'immobiles':immobile})
    <!-- Filter por Intervalo de data -->
    <div class="col-auto">  
        <form class="d-flex align-items-end" action="{% url 'reports' %}"> 
            <div class="">
                <label for="">Inicio</label>
                <input name="dt_start" type="date" value="{{request.GET.dt_start}}" class="form-control me-2"> 
            </div>
            <div class="">
                <label for="">Final</label>
                <input name="dt_end" type="date" value="{{request.GET.dt_end}}" class="form-control me-2"> 
            </div>
            <div class="">
                <button class="btn btn-outline-dark" type="submit"><i class="fas fa-filter"></i></button> 
            </div>
        </form> 
    </div>

djangoprojeto3-immobile's People

Contributors

eticialima avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Forkers

bbroger1

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.