2017-01-06 9 views
-1

に追加すると、トピックを公開することができます。これにより、 は、トピックモデルの一部としてpublicという属性(デフォルトではFalseに設定する必要があります)とトピックをプライベートからパブリックに変更できるnew_topicページのフォーム要素を要求します[ここにリンクの説明を入力してください] [1]Djangoモデルのpublic属性を

from django.db import models 
from django.contrib.auth.models import User 

class Topic(models.Model): 
    """A topic the user is learning about.""" 
    text = models.CharField(max_length=200) 
    date_added = models.DateTimeField(auto_now_add=True) 
    owner = models.ForeignKey(User) 

    def __str__(self): 
     """Return a string representation of the model.""" 
     return self.text 

class Entry(models.Model): 
    """Something specific learned about a topic.""" 
    topic = models.ForeignKey(Topic) 
    text = models.TextField() 
    date_added = models.DateTimeField(auto_now_add=True) 

    class Meta: 
     verbose_name_plural = 'entries' 

    def __str__(self): 
     """Return a string representation of the model.""" 
     return self.text[:50] + "..."enter code here 
+1

どうしたのですか? –

+0

トピックモデルでpublicという属性を追加すると、デフォルトでFalseに設定する必要があります。 –

+0

以下は、E本のページ番号382の練習問題20-5です。https://github.com/ehmatthes/pcc/blob/master/chapter_20/learning_logs/models.py –

答えて

-1

この時点でも私は固執しています。私はテンプレート上のフォーム要素のための解決策を持っています。

new_topic.html私はメタ属性公共追加することにより、forms.pyを編集した

<label><input type="checkbox" name="public"/> Public</label> 

forms.py

class TopicForm(forms.ModelForm): 
    class Meta: 
     model = Topic 
     fields = ['text'] 
     labels = {'text': ''} 
     public = forms.BooleanField(required=False) 

とを、私は、チェックボックスのようにそれを実装しています私はチェックボックスにチェックを追加しました:

@login_required 
def new_topic(request): 
    """Add a new topic.""" 
    if request.method != 'POST': 
     # No data submitted; create a blank form. 
     form = TopicForm() 
    else: 
     # POST data submitted; process data. 
     form = TopicForm(request.POST) 
     if form.is_valid(): 
      new_topic = form.save(commit=False) 
      new_topic.owner = request.user 
      if request.POST["public"]: 
       new_topic.public = True 
      new_topic.save() 
      return HttpResponseRedirect(reverse('learning_logs:topics')) 

    context = {'form': form} 
    return render(request, 'learning_logs/new_topic.html', context) 

チェックボックスをクリックすると、public属性が正しくtrueに変更されますが、そのトピックの@login_requiredを上書きすることはできません。正確には、新しく作成されたトピックは公開されません。誰かがあなたは単にあなたのTopicモデルのフィールドとして追加することができ、この時点

+0

これは本当に必要以上に複雑です。私の答えを見てください。 –

0

のソリューションを持っているのであれば、それは素晴らしいことだ:

public = models.BooleanField(default=False)

その後、あなたTopicFormのフィールドのリストに追加し、自動的にフォームにレンダリングされます:

fields = ['text', 'public']

関連する問題