使用Django,如何在创建新项目时为外键选择设置默认值

时间:2017-09-28 15:40:37

标签: django django-templates

我已经到了DjangoGirls tutorial的末尾并一直试图添加一些我自己的额外功能

我有一个名为Subject的新模型。每篇博客文章现在都有一个主题,如烹饪,园艺,天体物理,一般等。当博主撰写新帖子时,我想强制主题下拉列表默认为“常规”,但我的模板( post_edit.html)不允许我访问SELECT,因此我无法设置默认值

post_edit.html:

{% extends 'blog/base.html' %}

{% block content %}
    <div>
        <h1>New post</h1>
        <form method="POST" class="post-form">{% csrf_token %}
         {% if form.non_field_errors %}
            <ul>
                {% for error in form.non_field_errors %}
                <li>{{ error }}</li>
                {% endfor %}
            </ul>
        {% endif %}

        {% for field in form %}
                <div id="{{ field.auto_id }}_container"> {{ field.help_text }}
                    <div>
                        <span class="staticdata">{{ field.label_tag }}</span> 
                        <span class="staticdata">{{ field }}</span>
                    </div>
                    <div id="{{ field.auto_id }}_errors">
                        {{ field.errors }}
                    </div>
                </div>
        {% endfor %}
            <button type="submit" class="save btn btn-default">Save</button>
        </form>
    </div>
{% endblock %}

forms.py

from django import forms

from .models import Post, Subject
from django.contrib.auth.models import User

class PostForm(forms.ModelForm):

    class Meta:
        model = Post
        fields = ('title', 'text', 'subject', 'author')

models.py

from django.db import models
from django.utils import timezone


class Post(models.Model):
    author = models.ForeignKey('auth.User')
    title = models.CharField(max_length=200)
    text = models.TextField()
    created_date = models.DateTimeField(default=timezone.now)
    published_date = models.DateTimeField(blank=True, null=True)
    subject = models.ForeignKey('Subject')

    def publish(self):
        self.published_date = timezone.now()
        self.save()

    def __str__(self):
        return self.title

class Subject(models.Model):
    description = models.CharField(max_length=200)

    def __str__(self):
        return self.description

views.py

from django.shortcuts import render, get_object_or_404
from django.shortcuts import redirect
from django.contrib.auth.models import User
from django.contrib.auth import authenticate,logout,login
from django.utils import timezone
from .models import Post, Subject
from .forms import PostForm

def post_list(request):
    posts = Post.objects.filter(published_date__lte=timezone.now()).order_by('-published_date')
    return render(request, 'blog/post_list.html', {'posts': posts})

def post_detail(request, pk):
    post = get_object_or_404(Post, pk=pk)
    return render(request, 'blog/post_detail.html', {'post': post})    

def post_new(request):
    if request.method == "POST":
        form = PostForm(request.POST)
        if form.is_valid():
            post = form.save(commit=False)
            post.published_date = timezone.now()
            post.save()
            return redirect('post_detail', pk=post.pk)
    else:
        form = PostForm()
    return render(request, 'blog/post_edit.html', {'form': form})

def post_edit(request, pk):
    post = get_object_or_404(Post, pk=pk)
    if request.method == "POST":
        form = PostForm(request.POST, instance=post)
        if form.is_valid():
            post = form.save(commit=False)
            #... post.author = request.user
            post.published_date = timezone.now()
            post.save()
            return redirect('post_detail', pk=post.pk)
    else:
        form = PostForm(instance=post)
    return render(request, 'blog/post_edit.html', {'form': form})

def subject_list(request):
    subjects = Subject.objects.all().order_by('description')
    return render(request, 'blog/subject_list.html', {'subjects': subjects})

如何为此设置默认值,以便在用户导航到页面时使用默认选项填充下拉列表?

1 个答案:

答案 0 :(得分:2)

尝试按以下方式设置初始值

def post_new(request):
    if request.method == "POST":
        form = PostForm(request.POST)
        if form.is_valid():
            post = form.save(commit=False)
            post.published_date = timezone.now()
            post.save()
            return redirect('post_detail', pk=post.pk)
    else:
        # Get the default subject.
        # Perhaps you want to give your subject a name, or use an id here,
        # but assuming your default subject's description is 'General' for 
        # this example
        default_subject = Subject.objects.get(description="General")
        # Set the default value
        form = PostForm(initial={"subject":default_subject})
    return render(request, 'blog/post_edit.html', {'form': form})