【问题标题】:Django: text-input instead selection on foreignkeyDjango:文本输入而不是外键选择
【发布时间】:2017-08-26 17:47:42
【问题描述】:

我想在 ma django 应用程序中创建一个消息传递功能。用户应该能够给其他用户写短信。

models.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)

默认情况下,没有 forms.py 条目,我得到一个选择,这对许多用户来说是无用的。我希望消息发送者输入用户名,或者在第一步中输入用户 ID(我可以使用名称中的 ajax 解析)。

整数

但是使用 forms.py

recipient =         forms.IntegerField(    widget=forms.NumberInput , required=False,)

我明白了:

    Cannot assign "11": "Transport.recipient" must be a "User" instance.

ChoiceField 和 NumberInput

与:

recipient =          forms.ChoiceField(  widget=forms.NumberInput, required=False,)

我收到错误消息“无效”

是否可以“手动”编写外键?

【问题讨论】:

    标签: django django-models django-forms foreign-keys


    【解决方案1】:

    试试这个:

    recipient = forms.ModelChoiceField(queryset=User.objects.all(), widget=forms.Select, required=False)
    

    【讨论】:

    • thx,这为我指明了正确的解决方案,我只是改为“widget=forms.NumberInput”
    【解决方案2】:

    考虑到你的

    models.py -

    from django.contrib.auth.models import User
    class Message(models.Model):
        recipient   = models.ManytoMany(User, null=True)
        contentDescription = models.TextField()
    

    forms.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()
    

    views.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 render
    

    这并不完美,但可以让您了解如何实施。有了你提供的细节,这是我目前能做的最好的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-20
      • 2023-03-16
      • 2018-06-26
      相关资源
      最近更新 更多