2017-09-28 1 views
0

Je suis venu à la fin de la DjangoGirls tutorial et ont essayé d'ajouter quelques fonctionnalités supplémentaires de mon propreUtiliser Django, comment puis-je définir une valeur par défaut pour une clé étrangère sélectionnez lors de la création d'un nouvel élément

I avoir un nouveau modèle appelé Sujet. Chaque article de blog a maintenant un sujet comme la cuisine, le jardinage, l'astrophysique, général, etc. Lorsqu'un blogueur écrit un nouveau post, je veux forcer la liste déroulante Sujet par défaut à 'Général', mais mon modèle (post_edit.html) ne « t me donner accès au SELECT je ne peux pas définir une valeur par défaut

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

Comment puis-je définir une valeur par défaut de cette façon que la liste déroulante est remplie avec une option par défaut lorsque l'utilisateur accède à la page?

Répondre

2

Essayez une valeur initiale, de la manière suivante

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

C'est super, exactement ce que je avais besoin, merci beaucoup – fopdoodle