Django foreign key drop down

↘锁芯ラ 提交于 2020-01-14 19:23:05

问题


New to Django and Python and I need a little help with a foreign key drop down. Basically, I have a category model and a image model and I want users to be able to choose which category to put the image in. How do I create a drop down for the category in the image form? Are my views and html correct too? I have had a look online but I can't seem to do it myself. I keep getting errors.

Here are my models:

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

VIEWS:

@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)

FORMS:

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 %}

回答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 so you shouldn't need to do much else.


As an aside, give your models and fields more appropriate names. We know these are all image fields, because they are on the image and make sure, unless your model is a collection of things, you give it a singular name. Lastly, when using a Foreign Key and item gets an extra field of fieldname_id that is just the ID, whereas fieldname is the property that gives the related item as well.

So instead of:

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)

Use:

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)


来源:https://stackoverflow.com/questions/29196521/django-foreign-key-drop-down

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!