3

ユーザーが互いにメッセージを送信できるアプリケーションを作成しようとしています。

私が取り組んでいる関数は read と呼ばれ、ユーザーが受け取ったメッセージを読むことができます。

私のモデルが次のように機能する方法: すべてのメッセージはスレッドに関連しており、これは、相互に関連する返信メッセージを追跡するために使用されます。

私の関数は、メッセージ ID をキャプチャし、メッセージ スレッドに関連するすべてのメッセージをフィルタリングすることによって機能します。次に、フォームに現在のメッセージ ID を入力し、ユーザーがフォームに返信できるようにします。

ユーザーが POST 経由で送信すると、非表示のメッセージ ID を取得し、取得したメッセージ ID スレッドを使用して新しいメッセージを作成します。

問題: 文字制限を超えて現在のメッセージ ID に発生したエラーが入力された場合に、このような状況でエラーを発生させる方法がわかりません。誰かが私を助けてくれますか?

class Person(models.Model):
    user = models.ForeignKey(User)
    name = models.CharField(max_length=30, blank=True)
    def __unicode__(self):
        return self.user.username

class Thread(models.Model):
    subject = models.CharField(max_length=100, blank=True)
    user = models.ForeignKey(User)

class Message(models.Model):
    user = models.ForeignKey(User, related_name='sender')
    recipient = models.ForeignKey(User, related_name='recipient')
    created = models.DateTimeField(auto_now_add=True)
    body = models.CharField(max_length=1000)
    read = models.BooleanField(default=False)
    sentmessage = models.BooleanField(default=False)
    thread = models.ForeignKey(Thread)
    draft = models.BooleanField(default=False)

    def __unicode__(self):
        return self.body

ビュー:

@login_required
def read(request,id):

    try:
        messages = Message.objects.get(pk=id,recipient=request.user) 
    except Message.DoesNotExist:
        return HttpResponseRedirect(reverse('world:Display'))
    messages.read = True
    messages.save()
    if request.method =='POST':
        form = ReplyForm(request.POST)
        if form.is_valid():
            id = request.POST.get('hidden_field', False)
            try:
                messages = Message.objects.get(pk=id ,recipient=request.user,sentmessage=True,draft=False)

           except Message.DoesNotExist or Thread.DOesNotExist:
                return HttpResponseRedirect(reverse('world:LoginRequest'))
            person = Person.objects.get(user=messages.user)
            if person.inbox == "D":
                return HttpResponseRedirect(reverse('world:message'))
            body = form.cleaned_data['body']

            Message.objects.create(user=request.user,recipient=messages.user,body=body,thread=messages.thread,sentmessage=True,read=False)
            return HttpResponseRedirect(reverse('world:message'))

    message = Message.objects.filter(thread=messages.thread ).filter(created__lte=messages.created)
    person = Person.objects.get(user=request.user)

    initial = {}
    initial.update({'hidden_field': messages.id})
    form = ReplyForm(initial=initial)

    return render(request,'read.html',{'messages':messages,'form':form,'message':message,'person':person})

フォーム

class ReplyForm(forms.Form):
    body = forms.CharField(widget=forms.Textarea,required=False,max_length=555)
    hidden_field = forms.CharField(widget=forms.HiddenInput())       

テンプレート:

<div class="box22">




{% for m in message  %}

<div class="wrapper">
<div class="user">{{m.user.username}} </div>
<div class="message">{{m.body}}</div>
</div>

{% endfor %}


<form method="POST" >{% csrf_token %}
{{form.body}}{{form.hidden_field}}
<input type = "submit" value= "send" class="sen"/>
</form>


{{form.body.errors}}
4

2 に答える 2

2

まず、提出さform.cleaned_dataれたデータを取得するためだけに使用することをお勧めします。

id = form.cleaned_data['hidden_field']

また、関数の引数でid既に定義しているのに、request.POST データから再割り当てするのはなぜですか? id多分それは次のようになるはずです:

msg_response_id = form.cleaned_data['hidden_field']

次に、常にhidden_field値を確認する必要があり、カスタムの clean メソッドで確認できます。フォームにメソッドを追加し、 initclean_hidden_fieldフォーム メソッドをオーバーライドしてand を渡す必要があります。idmsg_response_id

あなたの見解では:

form = ReplyForm(initial=initial, id=id, msg_response_id=msg_response_id)

そしてフォーム:

class ReplyForm(forms.Form):

    def __init__(self, *args, **kwargs):
        self.id = kwargs.pop('id', None)
        self.msg_response_id = kwargs.pop('msg_response_id', None)
        super(ReplyForm, self).__init__(*args, **kwargs)

    hidden_field = forms.CharField(widget=forms.HiddenInput())

    def clean_hidden_field(self):
        if self.id and self.msg_response_id and self.id == self.msg_response_id:
            #  Raise form error, which will appear in your template.
            raise forms.ValidationError(_('You can't reply to your own message.'))
于 2013-07-26T13:34:07.540 に答える
1

あなたが何を望んでいるのかを説明している最後の段落はあまり明確ではありませんが、あなたがやろうとしていることは、フォームで特定の要件が満たされていない場合に例外を発生させることだと思います.

その場合は、ValidationErrordjango に組み込まれている an をキャッチするだけでうまくいきます。

したがって、次のようなものです。

try:
    form = ReplyForm(request.POST)
except ValidationError:
    # do what you want here

あるいは、

form = ReplyForm(request.POST)
if form.is_valid():
    # do stuff
else:
    raise ValidationError

これがうまくいかない場合は、django フォームを使用せずにポストデータの検証を試みることができますが、通常は django がこの問題を処理し、自動的にエラー メッセージを生成します。ここで @form validationをより深く見ることができます。

ただし、さらに細かい制御が必要な場合は、自分でフォームを作成し、ビュー内で検証を処理できます。それ以外の場合ValidationErrorは、トリックを実行して、エラー メッセージをリダイレクトできるようにする必要があります。

于 2013-07-26T01:23:57.300 に答える