form投稿時にユーザ情報を外部キーを自動的に設定する
環境
- django 1.8.7
- python 3.4.1
ユーザがform 投稿する時に、外部キーを自動的に設定したい。しかも、ユーザには意識させずに。
例えば、次のようなUser を外部キーにもつTweet のデータがあるとする。
form を投稿した人を自動的にowner にするようにする。
修正前
//models.py
class Tweet(models.Model):
''' project to be donated'''
name = models.CharField(max_length=100)
owner = models.ForeignKey(User)
text = models.TextField(blank=True)
categories = models.CharField(max_length=100,blank=True)
created_at = models.DateTimeField(auto_now_add=True, blank=True)
updated_at = models.DateTimeField(auto_now=True, blank=True)
terminated_at = models.DateTimeField(auto_now=True, blank=True)
def __unicode__():
return self.name
修正後
// views.py
from .models import Tweet, TweetCreateForm
from django.contrib.auth import User
@login_required
def tweet_create(request):
p = Tweet(owner=User.objects.get(pk=request.user.id))
form = TweetCreateForm(request.POST or None, instance=p)
form.save(commit=False)
if form.is_valid():
name = form.cleaned_data['name']
text = form.cleaned_data['text']
form.save()
return HttpResponseRedirect('/')
else:
return render(request, 'app/tweet_create.html', {'form': form})
models.py を修正する
// models.py
from django.db import models
from django.forms import ModelForm
from django import forms
class Tweet(models.Model):
''' project to be donated'''
name = models.CharField(max_length=100)
owner = models.ForeignKey(User, editable=False) # 編集不可にする。form に表示されなくなる。
text = models.TextField(blank=True)
categories = models.CharField(max_length=100,blank=True)
created_at = models.DateTimeField(auto_now_add=True, blank=True)
updated_at = models.DateTimeField(auto_now=True, blank=True)
terminated_at = models.DateTimeField(auto_now=True, blank=True)
def __unicode__():
return self.name
class TweetCreateForm(ModelForm):
class Meta:
model = Tweet
fields = '__all__'
foregin key だと デフォルトで全部の選択肢(今回だと全ユーザ)からの選択可能な状態になってしまい、UXが悪い。 ユーザには意識させずに、自動的にひも付けができるのでいい感じかと。
もっと良い書き方があるかもしれないなぁ。。