Quiero crear una función de mensajería en la aplicación ma django. El usuario debe poder escribir a otros usuarios un mensaje de texto.
modelos.py
from django.contrib.auth.models import User class Message(models.Model): recipient = models.ForeignKey(User, null=True) contentDescription = models.CharField(max_length=1000, null=True)De forma predeterminada, sin la entrada de formularios.py obtengo una selección, que será inútil para muchos usuarios. Quiero que el remitente del mensaje escriba el nombre de usuario o, en el primer paso, la identificación del usuario (que podría resolver con ajax a partir del nombre).
Pero con formularios.py
recipient = forms.IntegerField( widget=forms.NumberInput , required=False,)Yo obtengo:
Cannot assign "11": "Transport.recipient" must be a "User" instance.con:
recipient = forms.ChoiceField( widget=forms.NumberInput, required=False,)Me sale el mensaje de error "no valido"
¿Es posible escribir la clave externa 'manualmente'?
Prueba esto:
recipient = forms.ModelChoiceField(queryset=User.objects.all(), widget=forms.Select, required=False)teniendo en cuenta su
modelos.py -
from django.contrib.auth.models import User class Message(models.Model): recipient = models.ManytoMany(User, null=True) contentDescription = models.TextField()formularios.py
from .models import Message from django import forms from django.contrib.auth.models import User class MailForm(forms.ModelForm): recipient = forms.Charfield() class Meta: model = Message fields = ('contentDescription',) def clean_recipient(self): user_list = self.cleaned_data.get('recipient') # considering you post user_list of usernames as 'username1,username2,username3' if user_list is not None: user_list = user_list.split(',') user_qs = User.objects.filter(username__in=userlist) else: raise forms.ValidationError('Error in this field') return user_qs def save(self, user_qs): self.instance.user = user_qs return super().save()en vistas.py -
from .forms import MailForm def your_view(request): form = MailForm(request.POST or None) if form.is_valid(): user_qs=form.cleaned_data.get('recipient') form.save(user_qs) #return render here else: #create your context here and return renderEsto no es perfecto, pero puede darle una idea de cómo implementarlo. Con los detalles que diste, esto es lo mejor que puedo hacer por ahora.