【问题标题】:Django foreign key drop downDjango外键下拉
【发布时间】:2015-05-25 15:11:05
【问题描述】:

刚接触 Django 和 Python,我需要一些关于外键下拉菜单的帮助。基本上,我有一个类别模型和一个图像模型,我希望用户能够选择将图像放入哪个类别。如何在图像表单中为类别创建下拉列表?我的观点和 html 也正确吗?我在网上看过,但我自己似乎无法做到。我不断收到错误。

这是我的模型:

class Images(models.Model):
    image = models.ImageField(upload_to='images', blank=False)
    img_name = models.CharField(max_length=120, blank=True)
    img_date = models.DateTimeField(default=now())
    img_user = models.ForeignKey(User)
    img_cat_id = models.ForeignKey(Categories)

    def __unicode__(self):
        return self.img_name

class Categories(models.Model):
    cat_descr = models.CharField(max_length =120, blank=False)

    def __unicode__(self):
       return self.cat_descr

观看次数:

@login_required
def upload_images(request):
    context = RequestContext(request)
    context_dict={}

    if request.method == 'POST':  # render the form, and throw it back.
        # take the form data and process it!

        form = UploadImagesForm(request.POST, request.FILES)

        if form.is_valid():
            print 'form is_valid'


            upload_image = form.save(commit=False)
            upload_image.img_user = request.user

            if 'image' in request.FILES:
                upload_image.image  =request.FILES['image']

            upload_image.save()

            return render(request, 'rmb/upload.html', {'upload_image': form})

        else:
            print form.errors

    # Not a HTTP POST, so we render our form using two ModelForm instances.
    # These forms will be blank, ready for user input.
    else:
        form = UploadImagesForm()

        context_dict = {'upload_image': form}
        all_categories = Categories.objects.order_by('-id')
        context_dict['all_categories'] = all_categories
        print context_dict

        return render_to_response('rmb/upload.html', context_dict, context)

表格:

class UploadImagesForm(forms.ModelForm):

#cat_list = ModelChoiceField(queryset=Categories.objects.all())

class Meta:
    model = Images
    fields=('image','img_name')

HTML:

{% block body_block %}
    <form id="upload_form" method="post" action="/rmb/upload/"
            enctype="multipart/form-data">

            {% csrf_token %}
             {{ upload_image.as_table }}
            <input type="submit" name="submit" value="Upload" />
     {% for categories in all_categories %}

         <div> {{ categories.id }} </div>
         {{ categories.cat_descr }}
         <input type="submit" name="submit" value="Upload" />
      {% endfor %}


    </form>
{% endblock %}

【问题讨论】:

  • “我不断收到错误。”什么样的错误?
  • 另外,您的代码缩进不正确,导致故障排除非常困难。

标签: django forms drop-down-menu foreign-keys


【解决方案1】:

You don't need to insert the HTML for the form manually, just use {{form}} in the template.

{% block body_block %}
    <form id="upload_form" method="post" action="/rmb/upload/"
            enctype="multipart/form-data">

            {% csrf_token %}
            {{ form }}
    </form>
{% endblock %}

By default a ForeignKey will be a select field 所以你不需要做太多其他事情。


顺便说一句,给您的模型和字段起更合适的名称。我们知道这些都是图像字段,因为它们在图像上并且确保,除非您的模型是事物的集合,否则您给它一个单数名称。最后,当使用外键时,项目会获得一个额外字段 fieldname_id,这只是 ID,而 fieldname 也是提供相关项目的属性。

所以而不是:

class Images(models.Model):
    image = models.ImageField(upload_to='images', blank=False)
    img_name = models.CharField(max_length=120, blank=True)
    img_date = models.DateTimeField(default=now())
    img_user = models.ForeignKey(User)
    img_cat_id = models.ForeignKey(Categories)

用途:

class Image(models.Model):
    image = models.ImageField(upload_to='images', blank=False)
    name = models.CharField(max_length=120, blank=True)
    date = models.DateTimeField(default=now())
    user = models.ForeignKey(User)
    category = models.ForeignKey(Categories)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    • 2017-04-06
    • 2016-10-13
    • 2015-09-26
    • 1970-01-01
    • 2016-05-30
    相关资源
    最近更新 更多