2016-10-18 12 views
1

私はDjangoモデルのformset factoryを使って、ユーザーが画像を追加してアップロードした画像を変更できるテンプレートをレンダリングしようとしています(管理者の作業とよく似ています)。私は現在、テンプレートとその正しいフィールドをテンプレートにレンダリングすることができます。私ができないことは、ユーザーが事前に選択されていることです(現在ログインしています)。ページを更新すると、画像が再度投稿されます(これが予防可能かどうかはわかりません)。以下は私のコードです。ありがとう!Djangoモデルのフォームセットの工場とフォーム

モデル:

class Image(models.Model): 
    user = models.ForeignKey(User) 
    image = models.ImageField(upload_to=content_file_name, null=True, blank=True) 
    link = models.CharField(max_length=256, blank=True) 

フォーム:

class ImageForm(forms.ModelForm): 
    image = forms.ImageField(label='Image') 

    class Meta: 
     model = Image 
     fields = ('image', 
        'link', 
       ) 

ビュー:

@login_required 
def register(request): 

user_data = User.objects.get(id=request.user.id) 
ImageFormSet = modelformset_factory(Image, 
            fields=('user', 'image', 'link'), extra=3) 

if request.method == 'POST': 
    print '1' 
    formset = ImageFormSet(request.POST, request.FILES, queryset=Image.objects.all()) 

    if formset.is_valid(): 
     formset.user = request.user 
     formset.save() 

    return render(request, 'portal/register.html', {'formset': formset, 'user_data': user_data}) 

else: 
    print '2' 
    formset = ImageFormSet(queryset=Image.objects.all()) 
    return render(request, 'portal/register.html', {'formset': formset, 'user_data': user_data}) 

テンプレート:

<form id="" method="post" action="" 
     enctype="multipart/form-data"> 

    {% csrf_token %} 

    {{ formset.management_form }} 
    {% for form in formset %} 
     {{ form }} 
    {% endfor %} 


<input type="submit" name="submit" value="Submit" /> 

答えて

1

あなたがそれを行う方法を教えてください。

MODELSの形態では

from django.utils.text import slugify 
from django.db import models 
from custom_user.models import AbstractEmailUser 

# User model 
class UserModel(AbstractEmailUser): 
    full_name = models.CharField(max_length=255) 

    def __str__(self): 
     return str(self.id) 

# Function for getting images from instance of user 
def get_image_filename(instance, filename): 
    title = instance.id 
    slug = slugify(title) 
    return "user_images/%s-%s" % (slug, filename) 

# Save images with user instance 
class UserImages(models.Model): 
    user = models.ForeignKey('UserModel', db_index=True, default=None) 
    image = models.ImageField(upload_to=get_image_filename, verbose_name='Image', db_index=True, blank=True, null=True) 

それはちょうど2つのフォーム、UserImagesモデルの他のモデルのユーザーのための一つです。

# Images forms 
class ImageForm(forms.ModelForm): 
    image = forms.ImageField(label='Image', required=False) 

    class Meta: 
     model = UserImages 
     fields = ('image',) 

# User form 
class UserForm(forms.ModelForm): 
    full_name = forms.CharField(required=True) 

    class Meta: 
     model = UserModel 
     fields = ('full_name','email','password',) 

そして、あなたはあなたが正しいことをやっているテンプレートでこの

# View 
from models import * 
from forms import * 

@csrf_protect 
def post_view(request): 
    template = 'some_template.html' 
    ImageFormSet = modelformset_factory(UserImages, form=ImageForm, extra=15) 
    if request.method == 'POST': 
     user_form = UserForm(request.POST, prefix='form1') 
     formset = ImageFormSet(request.POST, request.FILES, queryset=UserImages.objects.none(), prefix='form2') 

     if user_form.is_valid() and formset.is_valid(): 
      # Save User form, and get user ID 
      a = user_form.save(commit=False) 
      a.save() 

      images = formset.save(commit=False) 
      for image in images: 
       image.user = a 
       image.save() 

      return HttpResponseRedirect('/success/') 
     else: 
      user_form = UserForm(prefix='form1') 
      formset = ImageFormSet(queryset=UserImages.objects.none(), prefix='form2') 
    return render(request, template, {'form_user':user_form,'formset':formset}) 

ような何かを行うことができます記事の閲覧数インチ

+0

実装しようとすると:エラーuth.User.groups:(fields.E304)を取得し続けます。 'User.groups'の逆引きアクセサが 'UserModel.groups'の逆引きアクセサと衝突します。 \tヒント: 'User.groups'または 'UserModel.groups'の定義にrelated_name引数を追加または変更します。 auth.User.user_permissions:(fields.E304) 'User.user_permissions'の逆引きアクセサが 'UserModel.user_permissions'の逆引きアクセサと衝突します。 – Ryan113

+0

あなたはdjango-custom-userをインストールし、次にsettings.pyに次の行を追加する必要があります:AUTH_USER_MODEL = 'app.UserModel'。これは、モデルがデフォルトのDjango設定を上書きすることです。詳細情報:https://github.com/jcugat/django-custom-user – marin

関連する問題