とくに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'}
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 件のコメント:
コメントを投稿