2022年8月16日火曜日

Djanog 覚書6 基本のまとめ

 とくにViewとFormあたりで、関数なのか、クラスなのかで、いろいろごちゃまぜになりやすい。関数のほうが、カスタマイズしやすいので、Formと一緒に基本的なことをまとめてみた。

#FORM

class CommunityForm(forms.ModelForm):     
 community_introduction = forms.CharField(widget=forms.Textarea(attrs={'placeholder':'紹介文...'}), max_length=512,label="コミュニティ紹介")       

        model=Community
        fields={'id','community_name','community_photo','community_introduction'}

#VIEW
@login_required
def community_create(request):
    if request.method == "POST":
        form = CommunityForm(request.POST)
        if form.is_valid():
            com=form.save(commit=False)
            com.community_photo=request.FILES.get('community_photo')←画像はこの処理が必要
            com.created_by=request.user ←念のため入れる?
            com.save()
            return redirect(community_detail,pk=com.id)
    else:            
            form = CommunityForm({'created_by':request.user}) ←正しくは、このようにするとOk
            #form.created_by= request.user ←あらかじめ、データを入れておくために、最初、これで試したがだめだった。
なお、CommunityFormのほうでは、fieldにcreated_byは入れないことで表示はしない。けれど、Communityのモデルの処理は行ってくれる。このへんに、注意が必要かも。
    return render(request,'accounts/community_create.html',{'form':form})



@login_required
def community_update(request, pk):
    com = get_object_or_404(Community, id=pk)
    if com.created_by.username != request.user.username:
        return HttpResponseForbidden("この編集は許可されていません。")
    if request.method == "POST":
        form = CommunityForm(request.POST, instance=com)
        if form.is_valid():
            post=form.save()
            post.community_photo=request.FILES.get('community_photo')←画像はこの処理が必要
            post.created_by=request.user ←念のため入れる?
            post.save()
            return redirect('community_list')←ここは、detailでもいいかもしれない
    else:
        form = CommunityForm(instance=com)
    return render(request, 'accounts/community_update.html', {'form': form})

※上記の方法だと、Updateのときに、画像データが消えてしまう。
これを避けるには、以下のように修正するといいようだ。

@login_required
def community_update(request, pk):
    com = get_object_or_404(Community, id=pk)
    if com.created_by.username != request.user.username:
        return HttpResponseForbidden("この編集は許可されていません。")
    if request.method == "POST":
        if not request.FILES:
            request.FILES['community_photo'] = com.community_photo #更新時画像保持
        form = CommunityForm(request.POST, request.FILES, instance=com) #blank=Turue,null=Trueだと、request.FILESが必須とのこと
        if form.is_valid():
            post=form.save()
            post.community_photo=request.FILES.get('community_photo')
            post.created_by=request.user
            post.save()
            return redirect('community_list')
    else:
        form = CommunityForm(instance=com)

    return render(request, 'accounts/community_update.html', {'form': form})



0 件のコメント:

コメントを投稿