1


私はdjangoを初めて使用し、現在ログインしているユーザーをユーザーが作成するコンテキスト(私のモデルクラス)に関連付けるように求められました。User (from ) オブジェクト
を取得する方法/場所は? request.userモデルに設定する方法は? 一般的なビューを使用してビューに渡すことは可能ですか?request.user

ここに私のコンテキストクラスがあります:

from django.contrib.auth.models import User

class Context(models.Model):
    title = models.CharField(max_length=32)
    description = models.TextField()
    user = models.ForeignKey(User,null=False)

フォームは次のとおりです。

class ContextForm(ModelForm):

    def __init__(self, *args, **kwargs):
        self.helper = FormHelper()
        self.helper.form_method = 'post'        
        self.helper.add_input(Submit('submit', 'Submit'))
        super(ContextForm, self).__init__(*args, **kwargs)

    class Meta:
        model = Context
        exclude = ('user')

urls.py からの URL:

url(r'^create/$', CreateView.as_view(model=Context, form_class=ContextForm),name='context_create'),

最後に、サクサクしたフォームの context_form.html

{% load crispy_forms_tags %}
{% block content %}
  {% crispy form %}
{% endblock %}

よろしくお願いします。

4

2 に答える 2

1

django-bracesをチェックしてください!現在のユーザーをkwargsからポップするフォームミックスインがあります。ユーザーをフォームに渡すクラスベースのビューのミックスインもあります。クラスベースのビューを実行している場合は、forms.pyとviews.pyで提供されているミックスインを使用し、save()メソッドをオーバーライドします。

forms.py:

from braces.forms import UserKwargModelFormMixin

class ContextForm(UserKwargModelFormMixin, ModelForm):

    def __init__(self, *args, **kwargs):
        self.helper = FormHelper()
        self.helper.form_method = 'post'        
        self.helper.add_input(Submit('submit', 'Submit'))
        super(ContextForm, self).__init__(*args, **kwargs)

    class Meta:
        model = Context
        fields = ('title', 'description',)

    def save(self, force_insert=False, force_update=False, commit=True):
        obj = super(ContextForm, self).save(commit=False)
        obj.user = self.user
        if commit:
            obj.save()
        return obj

views.py

from braces.views import UserFormKwargsMixin

class CreateContextView(UserFormKwargsMixin, CreateView)

    model = Context
    form_class = ContextForm

urls.py:

url(r'^create/$', CreateContextView.as_view(),name='context_create'),

次のようにすることもできます。

forms.py:

class ContextForm(ModelForm):

    def __init__(self, *args, **kwargs):
        self.user = kwargs.pop("user", None)
        self.helper = FormHelper()
        self.helper.form_method = 'post'        
        self.helper.add_input(Submit('submit', 'Submit'))
        super(ContextForm, self).__init__(*args, **kwargs)

    class Meta:
        model = Context
        fields = ('title', 'description',)

    def save(self, force_insert=False, force_update=False, commit=True):
        obj = super(ContextForm, self).save(commit=False)
        obj.user = self.user
        if commit:
            obj.save()
        return obj

views.py

def some_view(request):
    ...
    form = ContextForm(request.POST, user=request.user)
    ...
于 2013-02-01T16:35:05.677 に答える
0

あなたのモデルで:

from django.contrib.auth.models import User

class Context(models.Model):
    title = models.CharField(max_length=32)
    description = models.TextField()
    user = models.OneToOneField(User)

ユーザーに関連付けるビューで:

    if request.method == 'POST':
            form = ContextForm(request.POST)
            if form.is_valid():
                    user = User.objects.create_user(username=form.cleaned_data['username'], email = form.cleaned_data['email'], password = form.cleaned_data['password'])
                    user.save()

                    obj = Context(user=user, title=form.cleaned_data['title'], description=form.cleaned_data['description'])
                    obj.save()

ログインを要求する必要がある場合は、 @login_requiredを追加してください

@login_required
def myfunction(request): 
     ...

このチュートリアルを見てください

編集

編集した質問を見ました。これを urls.py に追加する必要があります。

TEMPLATE_CONTEXT_PROCESSORS = (
    'django.core.context_processors.request',
)

これは、RequestContext を使用してレンダリングされるすべてのテンプレート (すべての汎用ビュー) に渡されることを意味します。

于 2013-02-01T16:32:46.127 に答える