2016-12-06 16 views
2

私は、「作成」画面を生成するために私のモデルを使用して、以下のクラスベースのビューがあります。generic.edit.CreateView割り当てのデフォルト値とデータベースに挿入

class ProjectCreateView(generic.edit.CreateView): 
    model = Project 
    fields = ['project_title','project_description','created_date'] 
    template_name = 'steps/project-detail.html' 
    success_url = reverse_lazy('index') 

モデル:

class Project(models.Model): 
    project_title = models.CharField(max_length=200) 
    project_description = models.CharField(max_length=200, default="") 
    created_date = models.DateTimeField('date created') 
    owner = models.ForeignKey(User) 

    def __str__(self): 
     return self.project_title 

今、問題は私が'created_date'を実際のフォームに載せたくないということです。代わりに、[送信]ボタンを押すたびに、またはレコードがデータベースに追加されるたびに、自動的に値を入力するようにします。どうすればこれを達成できますか?

最後に、ownerフィールドをデフォルトで指定することはできますか?つまり、このレコードを作成しているユーザーの情報をそのフィールドに入力する必要があります。

答えて

2

ownercreated_dateをフィールドの一覧から除外します。次にform_validをオーバーライドし、super()を呼び出す前にフォームのインスタンスの値を設定します。

オーナーを設定しているので、LoginRequiredMixinを使用すると、ログインしているユーザーだけがそのビューにアクセスできることを確認できます。

from datetime import datetime 

from django.contrib.auth.mixins import LoginRequiredMixin 
from django.views.generic.edit import CreateView 


class ProjectCreateView(LoginRequiredMixin, CreateView): 
    model = Project 
    fields = ['project_title','project_description'] 
    template_name = 'steps/project-detail.html' 
    success_url = reverse_lazy('index') 

    def form_valid(self, form): 
     form.instance.owner = self.request.user 
     form.instance.created_date = datetime.now() 
     return super(ProjectCreateView, self).form_valid(form) 
+1

何日時フィールドのために(https://docs.djangoproject.com/en/1.10/ref/models/fields/#django.db.models.DateField.auto_now_add)[auto_now_add' ']使用について代わりに? – AKS

+1

@AKSはい、モデルフィールドに 'auto_now_add'を使うのは良い提案です。その場合、 'form.instance.created_date = datetime.now()'行をコードから削除することができます。 – Alasdair

+0

これはどのように見えるでしょうか? inと同様に、auto_now_addをモデルに追加するとエラーになります。 – MadPhysicist

関連する問題