2012-01-31 1 views
0

私はdjangoでビデオモデルを持っています。現在、ビデオが保存されると、現在ログに記録されているユーザーはモデルに保存されません(他のフィールドはユーザーフィールド以外の値を持ちます)。このフォームでは、汎用のcreate djangoビューを使用します。 新しいビデオが保存されたときに現在のログに記録されているユーザーを保存する方法を知りたいですか?Djangoで外部キーを使用するには?

マルチメディア/ models.py

from django.db import models 
from django.contrib.auth.models import User 
from django.forms import ModelForm 
from django.core.exceptions import PermissionDenied 
from django.db.models.signals import post_save 
from django.contrib.auth.decorators import login_required 


class Video(models.Model): 
    user = models.ForeignKey(User, related_name='+',blank=True, null=True) 
    title = models.CharField(max_length=200) 
    description = models.TextField() 
    created = models.DateTimeField('date created', auto_now_add=True, blank=False) 
    file_url = models.CharField(max_length=2000, blank=True) 
    file_name = models.CharField(max_length=255, blank=True) 
    file_uploaded = models.DateTimeField('date file uploaded', null=True, blank=True) 
    file_upload_speed = models.FloatField(null=True, blank=True) 
    file_size = models.IntegerField(null=True, blank=True) 

    def has_file(self): 
     return len(self.file_url) > 0 

    def __unicode__(self): 
     return self.title 

    @models.permalink 
    def get_absolute_url(self): 
     return ('multimedia_video_detail', [self.id]) 

class VideoForm(ModelForm): 
    class Meta: 
     model = Video 
     # fields = ('title', 'description') 
     exclude = ('file_url', 'file_name', 'file_uploaded','file_upload_speed', 'file_size') 

マルチメディア/ views.py任意のヘルプは、あなたにこの問題

答えて

1

を解決する代わりに、直接一般的な作成ビューを使用するため

from django.conf.urls.defaults import patterns, include, url 
from models import Video, VideoForm 
# Uncomment the next two lines to enable the admin: 
from django.contrib import admin 
admin.autodiscover() 

urlpatterns = patterns('', 
    url(r'^$','django.views.generic.list_detail.object_list',{ 'queryset': Video.objects.all() }, name='multimedia_video_list'),  
    url(r'^new$', 'django.views.generic.create_update.create_object',{ 'model': Video },name='multimedia_video_new'), 
    url(r'^(?P<object_id>[\d]*)$', 'django.views.generic.list_detail.object_detail',{ 'queryset': Video.objects.all() }, name='multimedia_video_detail'), 
    url(r'^(?P<object_id>[\d]*)/edit$','django.views.generic.create_update.update_object',{ 'form_class': VideoForm }, name='multimedia_video_edit'), 
    url(r'(?P<object_id>[\d]*)/delete$', 'django.views.generic.create_update.delete_object', { 'model': Video, 'post_delete_redirect': '/videos' }, name='multimedia_video_delete'),  
    url(r'^(?P<object_id>[\d]*)/upload$','multimedia.views.upload_video',name='multimedia_video_upload'), 
    url(r'^(?P<object_id>[\d]*)/upload/done$','multimedia.views.upload_video_done',name='multimedia_video_upload_done'), 
) 

感謝現在のユーザーを要求から引き出すラッパーを使用する必要があります。さらに、ユーザーを受け入れるモデル・フォームを作成し、save()メソッドをオーバーライドしてモデル・インスタンスのユーザー値を設定します。

def VideoForm(user): 
    class _wrapped(forms.ModelForm): 
     class Meta: 
      model = models.Video 

     def save(self, *args, **kwargs): 
      self.instance.user = user 
      super(_wrapped, self).save(*args, **kwargs) 

    return _wrapped 

@login_required 
def create(request): 
    return django.views.generic.create_update.create_object(form_class=VideoForm(request.user), name='multimedia_video_new') 
+0

ありがとうございました。いくつかの合併症がありましたが、情報は非常に便利でした。 Rubyのバックグラウンドで私はカスタムビューを持つソリューションを選択しました。 – ipegasus

関連する問題