簡體   English   中英

Django 表單多對多字段不保存到數據庫

[英]Django form manytomany field not saving to database

我是 Django 的新手,我正在一個用戶可以提交帖子的網站上工作。 當我在 model 中有許多字段時,Django 表單未保存在數據庫中。 我不知道我是否可以在 Django 中實現這一點,我想將其他用戶名附加到帖子中,這樣當我提交表單時,當我在管理員中檢查帖子時會自動選擇用戶名。 為了清楚起見,我將附上屏幕截圖。

下圖是我的表單,您可以看到“我的帖子”是 image_caption,而“andy”是另一個用戶名,我希望在提交表單時在 manytomany 字段中自動選擇“andy”。

在此處輸入圖像描述

這就是我在提交表單時想要的,然后我在管理員中簽入。 提交表單時,在多對多字段中選擇了另一個用戶名(andy)。 我手動完成了這個

在此處輸入圖像描述

Model:

class Profile(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL,on_delete=models.CASCADE,blank=True,null=True)
    profile_pic = models.ImageField(upload_to='ProfilePicture/', default="ProfilePicture/user-img.png", blank=True)

class Post(models.Model):
    poster_profile = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE,blank=True,null=True)
    image_caption = models.TextField(blank=True, null=True)
    tag_someone = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='tagged_users', blank=True)

Forms:

class PostForm(forms.ModelForm):
    class Meta:
        model = Post
        fields = (
            'image_caption', 
            'tag_someone',
        )

意見:

def upload_view(request):
    ImageFormset = modelformset_factory(File, fields=('files',), extra=20)
    if request.method == "POST":
        form = PostForm(request.POST)
        formset = ImageFormset(request.POST, request.FILES)
        if form.is_valid() and formset.is_valid():
            post = form.save(commit=False)
            post.poster_profile = request.user
            post.save()
            form.save_m2m()

            for f in formset:
                try:
                    photo = File(post=post, files=f.cleaned_data['files'])
                    photo.save()
                except Exception as e:
                    break
            return redirect('/')

    else:
        form = PostForm()
        formset = ImageFormset(queryset=File.objects.none())

    #User Name Auto-complete In Tag Form
    all_users = User.objects.values_list('username', flat=True) 

    context = {
        'form': form,
        'formset': formset,
        'all_users': all_users,
    }
    return render(request, 'upload.html', context)

上傳.html:

 <form method="POST" enctype="multipart/form-data">
 {% csrf_token %}
  {{ form }}
  {{ formset }}
  <button type="submit" class="btn btn-primary btn-sm btn-block w-25">Post</button>
 </form>

我能夠通過將小部件更改為:

widget = { 
    forms.Select(),
 } 

您可以在此處更改小部件。 小部件負責將輸入輸出到 HTML。 所以你只需要:

class PostForm(forms.ModelForm):
class Meta:
    model = Post
    fields = (
        'image_caption', 
        'tag_someone',
    )
  widgets = {'tag_someone': forms.TextInput}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM