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

使用Django,如何在创建新项时为外键选择设置默认值,django,django-templates,Django,Django Templates,我已经结束了,并且一直在尝试添加一些我自己的额外功能 我有一个新的模型叫主题。现在,每篇博客文章都有一个主题,如烹饪、园艺、天体物理学、普通等。当一个博客作者写一篇新文章时,我想强制主题下拉到默认的“普通”,但我的模板(post_edit.html)不允许我访问选择,所以我无法设置默认值 post_edit.html: {% extends 'blog/base.html' %} {% block content %} <div> <h1>New

我已经结束了,并且一直在尝试添加一些我自己的额外功能

我有一个新的模型叫主题。现在,每篇博客文章都有一个主题,如烹饪、园艺、天体物理学、普通等。当一个博客作者写一篇新文章时,我想强制主题下拉到默认的“普通”,但我的模板(post_edit.html)不允许我访问选择,所以我无法设置默认值

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

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

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

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

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

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

太好了,正是我需要的,非常感谢。太好了,正是我需要的,非常感谢