Closed2
django辛いよ
DjangoのクラスベースView
ビューを関数じゃなくてクラスで書こうぜ的なやつ
from django.views import generic
class HogeView(generic.TemplateView):
template_name="hoge.html"
たった2行でビューが作れる。
render
とかいらない
context
の指定
context
class HogeView(generic.TemplateView):
template_name="hoge.html"
def get_context_data(self, **kwargs):
# kwargs == context
kwargs["hoge"] = "fuga"
return super().get_context_data(**kwargs)
FormViewとかだと若干書き方変わるので以下参照
Djangoのフォーム
脳死で書いて死んだのでまとめとく
forms.py
class TradeForm(forms.Form):
name = forms.CharField(
label="ユーザ名",
)
tags = forms.MultipleChoiceField(
label="タグ",
disabled=False,
widget=forms.SelectMultiple(),
)
def __init__(self, *args, **kwargs):
tags_field = self.fields["tags"]
tags_field.choises = get_tag_list()
views.py
# form を表示するview
# form_valid, form_invalid でバリデーションの成功時/失敗時それぞれの動きを制御する
class HogeFormView(generic.FormView):
template_name = "hogehoge.html"
form_class = HogeForm
success_url = "redirect/on/success" # reverseやreverse_lazyを使うとより良さそう?
def form_valid(self, form):
print("save data")
print(form.cleaned_data) # form.cleaned_data でデータにアクセスできる
return super().form_valid(form)
hogehoge.html
<form method="post"> # actionは自分自身、バリデーション成功時はFormView.success_urlへリダイレクト、失敗時は自分自身へ戻ってくる
{% csrf_token %}
<div class="form-group">
{{form.as_div}}
</div>
<button type="submit" class="btn btn-primary">
送信
</button>
</form>
reverse
関数とかも勉強しなきゃなぁって感じ
class
などの属性を付与
動的にFormクラスで<field>.widget.attrs["属性名"]
でアクセスできる。bootstrapとかでclassをつけたいときに便利。
name_field = self.fields["name"]
name_field.widget.attrs["class"] = "form-control"
for field in self.fields.values()
でループして一括で付与するのも時と場合を選べば良さげ
マルチセレクト
class TradeForm(forms.Form):
tags = forms.MultipleChoiceField(
label="タグ",
disabled=False,
widget=forms.SelectMultiple()
)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
tags_field = self.base_fields["tags"]
# 選択肢を指定
gives_field.choices = get_choice_tag()
# bootstrapを使ってる場合はクラス名も付与
gives_field.widget.attrs["class"] = "form-select"
このスクラップは2023/03/08にクローズされました