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とかだと若干書き方変わるので以下参照

https://en-junior.com/get_context_data/

てべすてんてべすてん

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にクローズされました