簡體   English   中英

Django:查詢數據庫的表單

[英]Django: form to query database

我希望用戶能夠執行以下查詢:

在沒有博士學位的情況下,用兩個日期之內的合同獲得全職合同的所有人。

在Django中翻譯:

Contract.objects.filter(
    person__is_doctor = False,
    type_contract = 'full',
    starting_date__gte = start_date,
    ending_date__lte = end_date
    )

如何制作表格/視圖/模板以允許用戶輸入start_dateend_date並顯示結果?

楷模

class Person(models.Model):
        name    = models.CharField(max_length=32)
        surname = models.CharField(max_length=32)
        address = models.CharField(max_length=32)
        is_doctor  = models.NullBooleanField(blank=True, verbose_name=_(u"Phd?")

TYPE_CONTRACT = (
    ('PT', 'Partial time'),
    ('FC', 'Full contract')
    )           

class Contract(models.Model):
        person        = models.ForeignKey(Person) #person hired
        type_contract = models.CharField(max_length = 9, blank = True, choices = TYPE_CONTRACT)
        starting_date = models.DateField(blank = True, null = True)
        ending_date   = models.DateField(blank = True, null = True)

首先,我將重構Contract模型以更好地封裝選擇,並且,為什么合同在開始日期和結束日期允許空值? 從業務邏輯的角度來看,這對我來說似乎很奇怪。

class Contract(models.Model):
    PT = 'Part Time'
    FC = 'Full Contract'
    CONTRACT_CHOICES = (
        ('PT', PT),
        ('FC', FC)
    )
    person        = models.ForeignKey(Person)
    type_contract = models.CharField(max_length=9, choices=CONTRACT_CHOICES,
        default=PT)
    starting_date = models.DateField()
    ending_date   = models.DateField()

# view

from django.shortcuts import render
from .forms import ContactForm

def filter_contracts(request):
    form = ContractForm(request.POST or None)
    contracts = None

    if request.method == 'POST':
        if form.is_valid():
            # encapsulating the contract values means you don't have to
            # hand-code them in the query so your code stays DRY
            contracts = Contract.objects.filter(person__is_doctor=False,
                type_contract=Contract.FC,
                starting_date__gte=form.cleaned_data.get('starting_date'),
                ending_date__lte=form.cleaned_data.get('ending_date'))
            # you might want to specify an order_by here
    return render(request, 'your_template.html', {'form': form,
        'contracts': contracts})

# template

<form action="." enctype="application/x-www-form-urlencoded" method="post">
    <ol>
        {{ form.as_ul }}
    </ol>
    {% csrf_token %}
    <button type="submit">Search</button>

    {% if contracts %}
    <table>
        {% for contract in contracts %}
        <tr>
            <td>{{ contract.person }}</td>
            <td>{{ contract.type_contract }}</td>
            <td>{{ contract.starting_date }}</td>
            <td>{{ contract.ending_date }}</td>
        </tr>
        {% endfor %}
    </table>
    {% endif %}
</form>

這是主要思想,另外,您還必須檢查start_date和end_date是否實際上在cleaned_data中,並在使用filter()時將其考慮在內。

形成

class MyForm(forms.Form):
    start_date = forms.DateField(initial=datetime.date.today)
    end_date = forms.DateField(initial=datetime.date.today)

視圖

def my_view(request):
    contracts = Contract.objects.filter(person__is_doctor=False, type_contract='full')
    # if this is a POST request take start_date and end_date into account
    if request.method == 'POST':
        form = MyForm(request.POST)
        if form.is_valid():
            contracts = contracts.filter(starting_date__gte=form.cleaned_data.get('start_date'), ending_date__lte=form.cleaned_data.get('end_date'))
    else:
        form = MyForm()
    # do everything else that you need to do before returning a response
    return render_to_response('template.html', locals(), context_instance=RequestContext(request))

模板

<form action="" method="post">
    {% csrf_token %}
    {{ form }}
    <input type="submit" value="Submit" />
</form>

{% for contract in contracts %}
    {{ contract.person }}
{% endfor %}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM