2017-11-13 6 views
0

私はDjangoをかなり新しくしており、少し問題に直面しています。私は2つのhtml日付フィールド - start_dateとend_dateを持つ私のhtmlテンプレートを持っています。私はそれらのフィールドの内容をviews.pyに渡して、その期間のデータを表示したいが、それを動作させるのに問題がある。どんな助けでも大歓迎です。関連コード:HTMLからDjangoのビューに日付をインポートする

home.html

Select time period: 
    <br> 
    From: 
    <input id = "start_date" type="date" name="From" value="{{data.start_date|date:"d/m/Y"}}"> 
    To: 
    <input id = "end_date" type="date" name="To" value="{{data.end_date|date:"d/m/Y"}}"> 
    <input type = "submit"> 

{% for data in data.all %} 
     {% if data.profile.user.username == user.username %} 

     <tr> 
     <td>{{data.profile.user.username}}</td> 
     <td>{{data.date}}</td> 
     </tr> 

     {% endif %} 
     {% endfor %} 

views.py

import datetime 
from datetime import date 

@login_required 
def home(request): 
    if request.user.is_authenticated(): 
      user = request.user.username 


    start_date = request.GET.get['start_date'] 
    end_date = request.GET.get['end_date'] 

    data = Data.objects.filter(date__range=[start_date, end_date]) 

    context = { 

      'data': data, 
      'cpu_hours_all': cpu_hours_all, 
    } 

models.py

class Profile(models.Model): 
user = models.OneToOneField(User, on_delete=models.CASCADE 

def __str__(self): 
    return self.user.username 


class Data(models.Model): 
    date = models.DateField(blank=True) 
    profile = models.ForeignKey(Profile , on_delete=models.CASCADE) 

感謝 あらかじめ!

答えて

0

あなたが実際に意味「私は悩み、それが動作することが午前」ので、これはとにかく、せいぜい「野生の推測」の答えの部分と種類であってもよいが、どうなるかを説明するのに失敗しました:

まず、あなたがする必要があります

<form method="GET"> 
    <legend>Select time period:</legend> 
    <br> 
    From: 
    <input id="start_date" type="date" name="start_date" value="{{start_date|date:"d/m/Y"}}"> 
    To: 
    <input id="end_date" type="date" name="end_date" value="{{end_date|date:"d/m/Y"}}"> 
    <input type="submit"> 
</form> 
:あなたはあなたのビューに探しているものと一致する必要がありますあなたのフィールドを入れて、適切なHTTPメソッドと、タグに提出し、自分のフィールド「name」属性( ない「id」属性)

また、{{ start_date }}{{ end_date }}というフィールドをテンプレートのconteに入力していますxt、dataQuerysetであり、start_dateend_dateもありません。

次に、あなたのビューであなたがrequest.GET.get()を適切に使用する必要があります。

@login_required 
def home(request): 
    # ... 
    start_date = request.GET.get('start_date') 
    end_date = request.GET.get('end_date') 

.get()は方法ですが、それは(括弧、ないかっこ)添字ではない、と呼ばれている必要があります。ユーザーが実際にフォームを送信するまでは、これらのフィールドはクエリー文字列には含まれず、はNoneを返すので、デフォルト値を.get()に指定するか、フォームが送信されたかどうかをテストすることでこのケースを処理する必要があります。クエリーセットを返す(または空のクエリーセットを返すか、フィルタされていないクエリーセットなどを返す、あなたの選択はあなたのものです)。ここに空のクエリセットを返すバージョンがあります。また

、あなたはDjangoのforms.Formを使用していないことから、あなたがここに得るものQueryset.filter()は、Python datetime.dateまたはdatetime.datetimeオブジェクトを期待しながら、生unsanitized文字列が、あるので、手動でこれらの値を検証し、変換する必要があります:

# ... 
parsed_start_date = None 
parsed_end_date = None 
if start_date and end_date:  
    errors = {} 
    try: 
     parsed_start_date = datetime.datetime.strptime(start_date, "%d/%m/%Y") 
    except ValueError: 
     errors["start_date"] = "Invalid date" # etc.. 
    try: 
     parsed_end_date = datetime.datetime.strptime(end_date, "%d/%m/%Y") 
    except ValueError: 
     errors["end_date"] = "Invalid date" # etc.. 

if parsed_start_date and parsed_end_date: 
    data = Data.objects.filter(date__range=[parsed_start_date, parsed_end_date]) 
else: 
    data = Data.objects.none() # empty queryset 

context = { 
     'data': data, 
     'errors': errors, 
     'start_date': start_date, 
     'end_date': end_date 
     } 

# etc 

そして、あなたはそれらの変更を収容するために、あなたのテンプレートを変更する必要があります(...文字列、表示エラーに|dateフィルタを適用しようとしないでください):

<form method="GET"> 
    Select time period: 
    <br> 
    From: 
    <input id="start_date" type="date" name="start_date" value="{{start_date}}"> 
    {% if errors.start_date %} 
     <span class="error">{{ errors.start_date }}</span> 
    {% endif %} 
    To: 
    <input id="end_date" type="date" name="end_date" value="{{end_date}}"> 
    {% if errors.end_date %} 
     <span class="error">{{ errors.end_date }}</span> 
    {% endif %} 

    <input type="submit"> 
</form> 

using a Django formは、それほど苦痛を軽減します(さらに堅牢です)。

また、あなたはHTMLやPythonに堪能ではないようです。Djangoは非常に便利なPython Webフレームワークですが、HTTP、HTML、そしてもちろんPythonの基本的な知識が必要です。何かをやりたいと思えば、時間をかけてこれらのトピックを学ぶことをお勧めします。

+0

徹底した包括的な回答をいただきありがとうございます。私は提案されたトピックを読み上げます。 –

関連する問題